一个穷人的Python调试器。
PySnooperDB的Python项目详细描述
PySnooper-不再使用print进行调试
PySnooper是穷人的调试器。在
您正试图找出Python代码为什么没有按照您的想法进行。您希望使用一个功能齐全的带有断点和监视点的调试器,但您现在不必费心设置断点和监视。在
您需要知道哪些行正在运行,哪些没有运行,以及本地变量的值是什么。在
大多数人会在战略位置使用print
行,其中一些显示变量的值。在
PySnooper允许您执行相同的操作,只需在您感兴趣的函数中添加一行装饰符,而不必精心设计正确的print
行。您将得到一个函数的逐点日志,包括哪些行运行、何时运行,以及局部变量更改的确切时间。在
是什么使PySnooper从所有其他代码智能工具中脱颖而出?你可以在你的肮脏,杂乱无章的企业代码库中使用它,而不必做任何设置。只需打开decorator,如下所示,并通过将其路径指定为第一个参数,将输出重定向到专用日志文件。在
示例
我们正在编写一个函数,通过返回一个位列表将一个数字转换为二进制。让我们通过添加@pysnooper.snoop()
修饰符来窥探它:
importpysnooper@pysnooper.snoop()defnumber_to_bits(number):ifnumber:bits=[]whilenumber:number,remainder=divmod(number,2)bits.insert(0,remainder)returnbitselse:return[0]number_to_bits(6)
stderr的输出是:
^{pr2}$或者,如果不想跟踪整个函数,可以将相关部分包装在with
块中:
importpysnooperimportrandomdeffoo():lst=[]foriinrange(10):lst.append(random.randrange(1,1000))withpysnooper.snoop():lower=min(lst)upper=max(lst)mid=(lower+upper)/2print(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)
特点
如果stderr不易访问,可以将输出重定向到文件:
@pysnooper.snoop('/my/log/file.log')
您也可以传递一个stream或一个callable,它们将被使用。在
请参见某些不是局部变量的表达式的值:
@pysnooper.snoop(watch=('foo.bar','self.x["whatever"]'))
显示函数调用的函数的嗅探行:
@pysnooper.snoop(depth=2)
有关更多选项,请参见Advanced Usage。<;----
安装
您可以通过以下方式安装PySnooper:
- 皮普:
$ pip install pysnooper
- conda forge频道:
$ conda install -c conda-forge pysnooper
许可证
版权所有(c)2019 Rachum and collaborators,根据MIT许可发布。在
我提供Development services in Python and Django和我give Python workshops来教人 Python和相关主题。在
媒体报道
Hacker News thread 和{a6}(2019年4月22日)
- 项目
标签: