Python的简易调试器。
项目描述
PySnooper - 再次不要使用print进行调试
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"]'))
显示您函数调用的函数的snoop行
@pysnooper.snoop(depth=2)
有关更多选项,请参阅高级使用。 <------
使用Pip进行安装
安装PySnooper的最佳方式是使用Pip
$ pip install pysnooper
其他安装选项
使用conda和conda-forge频道
$ conda install -c conda-forge pysnooper
Arch Linux
$ yay -S python-pysnooper
Fedora Linux
$ dnf install python3-pysnooper
引用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许可证下发布。
媒体报道
Hacker News线程和/r/Python Reddit线程(2019年4月22日)
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。