介绍
为什么不要PySnoope中使用打印进行调试?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强> PySnooper 强>是一个非常方便的调试器。如果您正在试图弄清楚为什么您的Python代码没有按照您的预期去做,您会希望使用具有断点和监视功能的成熟调试工具,但是许多调试工具配置起来非常麻烦。
其实,PySnooper就是替代了一行一行打印的重复性工作,给你的代码一个PySnooper装饰器,它能自动识别到语句和变量并将其值打印出来:
import PySnooper , @pysnooper.snoop () def number_to_bits(数量): if 才能;数量: ,,,bits =, [] ,,,while 号码: ,,,,,,,remainder =, divmod(号码,2) ,,,,,bits.insert(0,余数) ,,,return 碎片 其他的才能: ,,,return [0] , number_to_bits (6)
效果如下:
Source 路径:py…, 1. Starting var:…, number =6 23:03:35.990701 call ,,,, 4, def number_to_bits(数量): 23:03:35.991699 line 5,,, if 号码: 23:03:35.991699 line 6,,,,, bits =, [] New var: ......., bits =, [] 23:03:35.991699 line 7,,,,, while 号码: 23:03:35.991699 line 8,,,,,,,,, remainder =, divmod(号码,2) Modified var:…, number =3 New var: ......., remainder =0 23:03:35.991699 line 9,,,,,,, bits.insert(0,余数) Modified var:…, bits =, [0] 23:03:36.004664 line 7,,,,, while 号码: 23:03:36.005661 line 8,,,,,,,,, remainder =, divmod(号码,2) Modified var:…, number =1 Modified var:…, remainder =1 23:03:36.005661 line 9,,,,,,, bits.insert(0,余数) Modified var:…, bits =, (1, 0) 23:03:36.007657 line 7,,,,, while 号码: 23:03:36.007657 line 8,,,,,,,,, remainder =, divmod(号码,2) Modified var:…, number =0 23:03:36.008655 line 9,,,,,,, bits.insert(0,余数) Modified var:…, bits =, (1,, 1,, 0] 23:03:36.008655 line 7,,,,, while 号码: 23:03:36.009651 line 10,,,,, return 碎片 10 23:03:36.009651 return ,,,,,,, return 碎片 Return 值:. .,(1,,1,,0] Elapsed 时间:,00:00:00.020945
可以看的到,它将每一行变量的值都输出到屏幕上,方便你调试代码。
仅仅需要写一行代码,使用装饰器就可以实现这个方便的调试功能,比起一行行写打印,这可方便多了。
<强> 0。安装模块强>
使用这个模块,你只需要使用脉冲安装PySnooper:
pip install PySnooper
接下来讲讲这个模块其他好用的功能:
<强> 1。支持日志文件强>
如果你觉得打印到屏幕上不方便,还可以将其输出到日志文件中,你只需要将装饰器那一行改为:
@pysnooper.snoop(& # 39;/我/日志/file.log& # 39;)
<强> 2。读取局外变量或其他表达式强>
如果你想读取在装饰器作用范围以外的变量或者表达式的值,还可以使用观察参数:
@pysnooper.snoop(看=(& # 39;foo.bar& # 39;,, & # 39; self.x [“whatever"] & # 39;))
<强> 3。如果你不想用装饰器,也可以用上下文的形式调试强>
没错,装饰器有限定的使用条件,使用起来比较局限,因此pysnooper还支持使用跟的上下文形式:
import pysnooper import 随机 , def foo (): 时间=lst 才能;[] for 才能小姐:拷贝范围(10): ,,,lst.append (random.randrange (, 1000)) , with 才能pysnooper.snoop (): ,,,lower =, min (lst) ,,,upper =,马克斯(lst) ,,,mid =,(时间+ lower 上),/2 ,,,print(低,中,,上) , foo ()
效果如下,只有上下文里的代码才会被调试出来:
New var: .......,小姐:=9 New var: ......., lst =, (681,, 267,, 74, 832, 284, 678,…] 09:37:35.881721 line 10,,,,, lower =, min (lst) New var: ....... lower =, 74 09:37:35.882137 line 11,,,,, upper =,马克斯(lst) New var: ....... upper =, 832 09:37:35.882304 line 12,,,,, mid =,(时间+ lower 上),/2 74,453.0,832 New var: ....... mid 453.0=, 09:37:35.882486 line 13,,,,,印刷(中期低,,,,) null为什么不要PySnoope中使用打印进行调试