一个穷人的Python调试器。

PySnooperDB的Python项目详细描述


PySnooper-不再使用print进行调试

Travis CI

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日)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java文件路径中的java UTF8字符   java如何可靠地写入OPC UA服务器?   for-my-if语句中的java循环不能产生我想要的结果   java我如何在1个XSL中加入2个XML   macos无法在“/Library/Java/JavaVirtualMachines/jdk15.0.1.jdk/Contents/Home/bin/apt”中找到可执行文件   Java代码简单数学   java如何避免selenium中的sendKeys方法清除之前填充的文本?   java如何将PlacesAPI自动完成小部件传递到自定义对话框?   带有文本块的java Intellij json片段问题   启动时Spring启动错误:java。木卫一。IOException:jsse。别名\u否\u键\u项   移动文件时发生java异常   http Java Web客户端远程连接