一个牛逼的 Python 调试工具

作者: 烟雨丿丶蓝 | 来源:发表于2019-05-03 16:18 被阅读10次

    一般情况下,在编写 Python 代码时,如果想弄清楚为什么 Python 代码没有按照预期执行的原因,比如你想知道哪些是正在运行,哪些没有运行,以及局部变量的值是什么...通常我们会使用包含断点和观察模式等功能成熟的调试器,或者直接使用 print 语句打印出来。

    今天和大家分享一个“贫民版”调试工具——PySnooper

    PySnooper允许你执行以上相同的操作,只需为要调试的函数添加一个装饰器即可,而不需要构建正确的 print 打印。你还将得到函数的详细日志,包括运行了哪些代码行、何时运行以及何时更改了局部变量。

    PySnooper 使用起来十分简单,开发者可以在任何庞大的代码库中使用它,而无需进行任何设置。你只需添加装饰器,并为日志输出地址指定路径,方法是将其路径指定为第一个参数。

    image

    目前,PySnooper在GitHub上已经获得7047个Star,371个Fork(GitHub地址:https://github.com/cool-RR/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)
    

    输出如下:

    Starting var:.. number = 6
    15:29:11.327032 call         4 def number_to_bits(number):
    15:29:11.327032 line         5     if number:
    15:29:11.327032 line         6         bits = []
    New var:....... bits = []
    15:29:11.327032 line         7         while number:
    15:29:11.327032 line         8             number, remainder = divmod(number, 2)
    New var:....... remainder = 0
    Modified var:.. number = 3
    15:29:11.327032 line         9             bits.insert(0, remainder)
    Modified var:.. bits = [0]
    15:29:11.327032 line         7         while number:
    15:29:11.327032 line         8             number, remainder = divmod(number, 2)
    Modified var:.. number = 1
    Modified var:.. remainder = 1
    15:29:11.327032 line         9             bits.insert(0, remainder)
    Modified var:.. bits = [1, 0]
    15:29:11.327032 line         7         while number:
    15:29:11.327032 line         8             number, remainder = divmod(number, 2)
    Modified var:.. number = 0
    15:29:11.327032 line         9             bits.insert(0, remainder)
    Modified var:.. bits = [1, 1, 0]
    15:29:11.327032 line         7         while number:
    15:29:11.327032 line        10         return bits
    15:29:11.327032 return      10         return bits
    Return value:.. [1, 1, 0]
    

    特性

    stderr,则可以将选择输出到指定文件:

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

    查看一些非局部变量的变量值:

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

    显示函数调用的函数的snoop行:

    @pysnooper.snoop(depth=2)
    

    如果你依然在编程的世界里迷茫,不知道自己的未来规划,对python感兴趣,可以来我的Python学习交流群:556370268,这里是python学习者聚集地,里面都是学习python的,小编也准备了一份python学习资料,从最基础的python【python,游戏,网络安全,数据挖掘,爬虫】到网络安全的项目实战的学习资料都有整理,希望能帮助你更了解python,学习python。

    相关文章

      网友评论

        本文标题:一个牛逼的 Python 调试工具

        本文链接:https://www.haomeiwen.com/subject/cjhznqtx.html