为什么不要PySnoope中使用打印进行调试

  介绍

为什么不要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中使用打印进行调试