zoukankan      html  css  js  c++  java
  • Python 调试工具PySnooper

    相信很多小伙伴平时写python的时候都是需要调试程序的,出问题了,需要了解函数内部是怎么跑的,而这个时候很多人都会想到在疑惑的地方使用print函数来打印一下参数来调试。虽然用print也是不失为是一种方法,但是有时如果疑惑的地方多就要每个地方都要加print,这样就显得比较麻烦了。

    今天发现在Github开源了一个神器,可以清楚让你清楚了解函数内部的运行以及参数值的变化,PySnooper,项目地址:https://github.com/cool-RR/PySnooper
    使用简单,强大,谁用谁知道它的好!下面简单说一下PySnooper的用法:

    这个工具使用起来很简单,首先直接可以使用 pip 安装:pip install pysnooper使用时,只需要在每个函数前面添加装饰器即可。
    给个简单例子看看就知道了,

    import pysnooper
    @pysnooper.snoop()
    def removeDuplicates(nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        flag = 0
        i=1
        while i<len(nums):
            if nums[i]==nums[i-1]:
                flag+=1
                i+=1
                if flag>=2:
                    del nums[i-1]
                    i-=1
            else:
                i+=1
                flag=0
        return len(nums)
    
    nums = [1,1,1,2]
    print(removeDuplicates(nums))
    

    添加装饰器后,运行代码就会输出对应函数的执行数据

    Starting var:.. nums = [1, 1, 1, 2]
    13:03:44.990194 call        11 def removeDuplicates(nums):
    13:03:44.990695 line        16     flag = 0
    New var:....... flag = 0
    13:03:44.990695 line        17     i=1
    New var:....... i = 1
    13:03:44.990695 line        18     while i<len(nums):
    13:03:44.990695 line        19         if nums[i]==nums[i-1]:
    13:03:44.990695 line        20             flag+=1
    Modified var:.. flag = 1
    13:03:44.990695 line        21             i+=1
    Modified var:.. i = 2
    13:03:44.991193 line        22             if flag>=2:
    13:03:44.991193 line        18     while i<len(nums):
    13:03:44.991193 line        19         if nums[i]==nums[i-1]:
    13:03:44.991193 line        20             flag+=1
    Modified var:.. flag = 2
    13:03:44.991193 line        21             i+=1
    Modified var:.. i = 3
    13:03:44.991193 line        22             if flag>=2:
    13:03:44.991193 line        23                 del nums[i-1]
    Modified var:.. nums = [1, 1, 2]
    13:03:44.991193 line        24                 i-=1
    Modified var:.. i = 2
    13:03:44.991193 line        18     while i<len(nums):
    13:03:44.991193 line        19         if nums[i]==nums[i-1]:
    13:03:44.991193 line        26             i+=1
    Modified var:.. i = 3
    13:03:44.991693 line        27             flag=0
    Modified var:.. flag = 0
    13:03:44.991693 line        18     while i<len(nums):
    13:03:44.991693 line        28     return len(nums)
    13:03:44.991693 return      28     return len(nums)
    Return value:.. 3
    

    当然如果嫌弃这个直接输出内容还想保存日志记录的话,这个装饰器还几个可选参数,例如:
    @pysnooper.snoop('log/file.log')
    先创建好log目录,然后将日志输出到file文件中。

    @pysnooper.snoop(prefix='removeDuplicates: ')
    给调试的行加个前缀名便于辨识和定位,这个参数适用于如果同时调试多个函数使用,我这里的例子是使用了函数名称来作为前缀名,摘抄一点日志记录如下:

    removeDuplicates: Starting var:.. nums = [1, 1, 1, 2]
    removeDuplicates: 13:53:14.322036 call        11 def removeDuplicates(nums):
    removeDuplicates: 13:53:14.323037 line        16     flag = 0
    

    @pysnooper.snoop(variables=('foo.bar', 'self.whatever'))
    查看非本地变量

    @pysnooper.snoop(depth=2)
    显示函数中调用函数的snoop行,depth参数的取值范围是大于或等于1的正整数,在源码里有这样一个判断:assert self.depth >= 1,当取小于1的值就会抛异常



    作者:吃鱼益智
    链接:https://www.jianshu.com/p/d26bf8950b59
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    微博(MicroBlog)
    面试题网站目录
    html 打印代码,支持翻页
    C#日期格式化
    职位英语简称注解
    专业术语:闭包、网站优化 Gzip 服务器端文件压缩
    1,由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。
    JSON-JSON 百科
    api.js
    Android消息处理机制
  • 原文地址:https://www.cnblogs.com/ExMan/p/11759014.html
Copyright © 2011-2022 走看看