- 很多同学在学习时,为了实时监测代码运行的过程以便更好的debug,通常会用到断点调试、IDE自带debug工具等。断点等调试方法虽然强大,但是设置比较麻烦。为此print成了很多人的最爱。
- 其实,我们用的最多的是,在重要计算、变量改变等地方加一个
print
,俗称打印(输出到屏幕),把我们需要监测的东西显示出来。嘿嘿,就是你,你就是这么做的;好吧,我承认,我也这么干! - 写完程序,我还要一行一行的吧这些
print
删除或者注释掉,说多了都是泪。。。
2019年新神器继位!-》pysnooper
- 记得我给我组学员的每次视频考核,都会提到:python的强大,在它的开源,有众多的第三方包开发者和维护者,你想做什么基本都有对应的第三方包
PySnooper
让你做print的事情,但不需要麻烦地添加很多语句,你只需要添加装饰器就可以得到运行日志,包括线运行,及对应变量的值。
实例
- 代码
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)
- 执行
Starting var:.. number = 6
21:14:32.099769 call 3 @pysnooper.snoop()
21:14:32.099769 line 5 if number:
21:14:32.099769 line 6 bits = []
New var:....... bits = []
21:14:32.099769 line 7 while number:
21:14:32.099769 line 8 number, remainder = divmod(number, 2)
New var:....... remainder = 0
Modified var:.. number = 3
21:14:32.099769 line 9 bits.insert(0, remainder)
Modified var:.. bits = [0]
21:14:32.099769 line 7 while number:
21:14:32.099769 line 8 number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
21:14:32.099769 line 9 bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
21:14:32.099769 line 7 while number:
21:14:32.099769 line 8 number, remainder = divmod(number, 2)
Modified var:.. number = 0
21:14:32.099769 line 9 bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
21:14:32.099769 line 7 while number:
21:14:32.099769 line 10 return bits
21:14:32.099769 return 10 return bits
- 从上面执行结果可以看出,
Pysnooper
将运行过程标准化的输出到屏幕,每个执行时间点变量发生了什么改变,对应哪个语句,何时被return,清晰明白。 - 你说上面输出内容的看不懂?(麻烦您好好看,思考一下)
特征和其他用法
Pysnooper
是以标准错误的方式输出(stderr),如果您不方便访问stderr,则可以重定向到文件:@pysnooper.snoop('/my/log/file.log')
- 查看非局部变量的值:
@pysnooper.snoop(watch=('foo.bar', 'self.x["whatever"]'))
- 展开值以查看其所有属性或列表/字典项:
@pysnooper.snoop(watch_explode=('foo', 'self'))
- 显示函数调用的snoop行:
@pysnooper.snoop(depth=2)
- 窥探指定前缀的行:
@pysnooper.snoop(prefix ='ZZZ')
高级用法
watch_explode
将根据其类自动猜测如何扩展传递给它的表达式。- 具体使用如下:
import pysnooper
@pysnooper.snoop(watch=(
pysnooper.Attrs('x'), # attributes
pysnooper.Keys('y'), # mapping (e.g. dict) items
pysnooper.Indices('z'), # sequence (e.g. list/tuple) items
))
- 你可以使用使用exclude参数排除特定键/属性/索引,例如:
Attrs('x', exclude=('_foo', '_bar')).
- 在“索引”后添加切片,仅查看该切片中的值,例如:
Indices('z')[-3:]
安装和使用
- 就不告诉你!
- 安装第三方包你都不会咩?
就是这个pysnooper,一个马上过万star的github项目,https://github.com/cool-RR/PySnooper/