同事给我推荐了这个调试神器,一直没工夫看,今天看了下。
原文链接:
体验了下,感觉最好的用法:1、优先逐行调试;2、一些复杂状态处理或者偶现的bug,可以用这个库调试;感觉并不会颠覆传统的调试手段,只是让添加日志更加便利了而已。
但是同事从后台开发的角度给出了他的看法,
稍微大型的python项目都只有开发的时候才逐行,服务器他们基本都靠日志,只是客户端习惯了debugger的调试。写个桌面程序,debugger很容易,这个服务就没那么简单了,尤其多进程服务,一般py debugger只能靠远程调试的模式。
并发多请求的时候,每个进程挂在不同端口的debugger上,很痛苦的,遇到时序问题,debugger一到介入,连重现都是问题
当习惯了这种logging方式,就像自己写的程序天生有诊断功能一样,后边再用debugger又觉得繁琐了。所以我一直觉着我们日志收集上报做的很好
分析Snooper的用法,你会发现他利用了python装饰器语法,那什么是装饰器呢?
它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上。和这个函数绑定在一起。在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,这顶帽子我们称之为装饰函数
或 装饰器。
import pysnooper @pysnooper.snoop() def number_to_bits(number): if number: bits = [] while number: number, remainder = divmod(number, 2) bits.insert(0, remainder) return bits else: return [0] number_to_bits(6)
下面的这篇文章讲得挺全的。
1) 装饰函数内定义具体需要如何处理传入的函数:
# 这是装饰函数 def logger(func): def wrapper(*args, **kw): print('我准备开始计算:{} 函数了:'.format(func.__name__)) # 真正执行的是这行。 func(*args, **kw) print('啊哈,我计算完啦。给自己加个鸡腿!!') return wrappe
2) 业务函数前将装饰器函数带上去:
@logger def add(x, y): print('{} + {} = {}'.format(x, y, x+y))
3)调用
add(200, 50)
4) 输出:
我准备开始计算:add 函数了: 200 + 50 = 250 啊哈,我计算完啦。给自己加个鸡腿!