极简PythonDeBug工具——PySnooper

DeBug Python 代码的方式有很多种?比如:

(1)设置断点

(2)print函数

(3)。。。

本文要介绍的是一个新开源的项目PySnooper ,只要给有疑问的代码加上装饰器,各种信息一目了然,找出错误也就非常简单。

项目地址:https://github.com/cool-RR/pysnooper

极简DeBug工具PySnooper

一般情况下,想要知道哪一行代码在运行、哪一行不运行、本地变量的值是多少时,大部分人会使用 print 函数,在关键部分打印某个或某组变量的值、形状、类型等信息。

而 PySnooper 让你能快速地获得这些信息,且相比之下它不需要细致地写 print 函数,只需要向感兴趣的函数增加一个装饰器就行了。我们会得到该函数的详细 log,包含哪行代码能运行、什么时候运行以及本地变量变化的确切时间。

相比于其他代码智能工具,PySnooper 为何如此优秀?因为不需要任何设置,你就可以在劣等、不规则的企业代码库上使用 PySnooper。只需要加个 装饰器 ,并为日志输出地址指定路径就行了。【注: 无论项目中还是面试都离不开装饰器话题,装饰器的强大在于它能够在不修改原有业务逻辑的情况下对代码进行扩展,权限校验、用户认证、日志记录、性能测试、事务处理、缓存等都是装饰器的绝佳应用场景,它能够最大程度地对代码进行复用

废话不多说,上案例代码:

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]

@pysnooper.snoop('F:/GitRepository/Python/PySnooper-Test/logs/file.log', prefix='ZZZ || ')
def number_to_bits2(number):
    if number:
        bits = []
        while number:
            number, remainder = divmod(number, 2)
            bits.insert(0, remainder)
        return bits
    else:
        return [0]

number_to_bits(6)
number_to_bits2(8)

该函数返回的日志如下,我们可以看到在调用 number_to_bits 函数时,赋予参数 number 的初始值为 6, 接着,PySnooper 就对着源代码一行行分析了。

使用PySnooper的正确姿势

首先使用 pip 安装包:

pip install pysnooper

然后,在使用时,import这个pysnooper就好。通过查看snoop函数的定义,很容易得出以下的使用心得:

1.如果标准错误输出难以获得,或者太长了,那么可以将输出定位到本地文件:

@pysnooper.snoop('/my/log/file.log')

2.查看一些非本地变量的值:

@pysnooper.snoop(variables=('foo.bar', 'self.whatever'))

3.展示我们函数中调用函数的 snoop 行:

@pysnooper.snoop(depth=2)

4.将所有 snoop 行以某个前缀开始,更容易定位和找到:

@pysnooper.snoop(prefix='ZZZ ')