跳转到主要内容

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

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

PySnooper-1.2.1.tar.gz (46.2 kB 查看哈希值)

上传时间:

构建分布

PySnooper-1.2.1-py2.py3-none-any.whl (15.1 kB 查看哈希值)

上传时间: Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面