PySnooper是一个穷人的调试器。如果您使用过 Bash,它就像 Python 中的set -x
,只不过它更高级。
您的故事:您试图找出为什么您的 Python 代码没有执行您认为应该执行的操作。您希望使用带有断点和监视的功能齐全的调试器,但您现在懒得去设置一个。
您想知道哪些行正在运行,哪些行没有运行,以及局部变量的值是什么。
大多数人会在战略位置使用print
线,其中一些显示变量的值。
PySnooper允许您执行相同的操作,只不过您无需仔细制作正确的print
行,而只需向您感兴趣的函数添加一个装饰器行。您将获得函数的详细日志,包括哪些行运行以及何时以及何时更改局部变量。
是什么让PySnooper从所有其他代码智能工具中脱颖而出?您可以在糟糕的、庞大的企业代码库中使用它,而无需进行任何设置。只需打开装饰器,如下所示,然后通过将其路径指定为第一个参数,将输出重定向到专用日志文件。
我们正在编写一个函数,通过返回位列表将数字转换为二进制。让我们通过添加@pysnooper.snoop()
装饰器来窥探它:
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 )
stderr 的输出是:
或者,如果您不想跟踪整个函数,可以将相关部分包装在with
块中:
import pysnooper
import random
def foo ():
lst = []
for i in range ( 10 ):
lst . append ( random . randrange ( 1 , 1000 ))
with pysnooper . snoop ():
lower = min ( lst )
upper = max ( lst )
mid = ( lower + upper ) / 2
print ( lower , mid , upper )
foo ()
输出如下:
New var:....... i = 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 = max(lst)
New var:....... upper = 832
09:37:35.882304 line 12 mid = (lower + upper) / 2
74 453.0 832
New var:....... mid = 453.0
09:37:35.882486 line 13 print(lower, mid, upper)
Elapsed time: 00:00:00.000344
如果您不容易访问 stderr,您可以将输出重定向到文件:
@ pysnooper . snoop ( '/my/log/file.log' )
您还可以传递流或可调用对象,它们将被使用。
查看一些不是局部变量的表达式的值:
@ pysnooper . snoop ( watch = ( 'foo.bar' , 'self.x["whatever"]' ))
显示您的函数调用的函数的监听行:
@ pysnooper . snoop ( depth = 2 )
有关更多选项,请参阅高级用法。 <------
安装PySnooper的最佳方法是使用 Pip:
$ pip install pysnooper
Conda 与 conda-forge 通道:
$ conda install -c conda-forge pysnooper
拱门Linux:
$ yay -S python-pysnooper
费多拉Linux:
$ dnf install python3-pysnooper
如果您在学术工作中使用 PySnooper,请使用以下引用格式:
@software { rachum2019pysnooper ,
title = { PySnooper: Never use print for debugging again } ,
author = { Rachum, Ram and Hall, Alex and Yanokura, Iori and others } ,
year = { 2019 } ,
month = { jun } ,
publisher = { PyCon Israel } ,
doi = { 10.5281/zenodo.10462459 } ,
url = { https://github.com/cool-RR/PySnooper }
}
版权所有 (c) 2019 Ram Rachum 及其合作者,根据 MIT 许可发布。
黑客新闻话题和 /r/Python Reddit 话题(2019 年 4 月 22 日)