Python: 告别Print?优秀的Debug神器---pysnooper

目录

1.传统采用print进行debug的方式

2.pysnooper神器的打印方式


相信小伙伴在调试程序的,出问题了,需要了解函数内部是怎么跑的,想知道哪些行正在运行,哪些没有运行,以及局部变量的值是什么?大多数人会选择在疑惑的地方使用print函数来打印一下参数来调试。

虽然用print也是不失为是一种方法,但是有时如果疑惑的地方多就要每个地方都要加print,这样就显得比较麻烦了。

Github开源了一个神器---PySnooper,允许和print执行相同的操作,只需向感兴趣的函数添加一个装饰器行,而不是小心地创建正确的打印行。将会得到函数的详细日志,包括运行了哪些行、何时运行、以及何时更改了局部变量。

1.传统采用print进行debug的方式

print在计算机编程中,应该算是使用最为频繁的一种操作。无论是C语言中的printf,还是C++中的count,还是python中的print,都是为了向控制台打印输出。

每一个入门编程的小伙伴都绕不过的坎,就是输出一个字符串“Hello World”,在python中是很简单的一句话,如下这样:

print('Hello World')

不仅仅是刚刚入门的小伙伴需要采用print函数打印查看输出,经验丰富的大牛在工作中也要经常性的打印出中间变量,判断是否和预想的输出结果一致,间接的判断程序中是否存在语句的错误。

使用Print进行调试的好处是非常直白,易于上手,但是弊端也是明显的:

  1. 如果要打印的信息比较多,就需要写很多行的Print语句;
  2. 在调试结束后,往往还需要逐一删除这些语句。这是一个繁琐的过程。
  3. 一言以蔽之,使用Print调试的缺点是效率较低

如下,展示了我们在debug代码时候,使用print查看参数最常用的方式:

def removeDuplicates(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    flag = 0
    i = 1
    while i < len(nums): # len(nums)=4
        if nums[i] == nums[i - 1]: # 相邻两个相等
            flag += 1
            i += 1
            print("flag=",flag)
            print("i=", i)
            if flag >= 2:
                del nums[i - 1] # 如果flag大于等于2,就从列表num是中删除第i-1个元素
                i -= 1
                print("i=",i)
                print("nums=",nums)
                
        else:
            print("else")
            i += 1
            flag = 0
    return len(nums)

nums = [1, 1, 1, 2]
print(removeDuplicates(nums))

 输出打印的结果,如下:

2.pysnooper神器的打印方式

PySnooper - Never use print for debugging again

此时,我们就直接将上文的代码print部分注释掉,其余部分不变,增加pysnooper部分,如下

import pysnooper
@pysnooper.snoop()
def removeDuplicates(nums):
    flag = 0
    i = 1
    while i < len(nums): # len(nums)=4
        if nums[i] == nums[i - 1]: # 相邻两个相等
            flag += 1
            i += 1
            if flag >= 2:
                del nums[i - 1] # 如果flag大于等于2,就从列表num是中删除第i-1个元素
                i -= 1
        else:
            i += 1
            flag = 0
    return len(nums)

nums = [1, 1, 1, 2]
print(removeDuplicates(nums))

打印结果如下:

  • 红色框部分,是该debug的时候,运行到哪一行了
  • 蓝色、绿色、黄色框,则是运行过程中参数的值
  • 红色框右侧则是运行到该行,执行的代码行

上面执行的这些,也就和在1中自行打印的参数值内容一致,采用pysnooper方法会更加的直观

如果你不容易访问stderr,你可以重定向输出保存到一个文件中:

import pysnooper
#@pysnooper.snoop()
@pysnooper.snoop('file.log')

然后,查看file.log,内容如下:

最后,送上安装方式,也是非常的简单,不报错

pip install pysnooper

更多的关于pysnooper的介绍,可直接去github查看,现在已经12.6K赞啦:https://github.com/cool-RR/PySnooper

参考部分:https://slxiao.github.io/2019/06/01/print/

小白CV:公众号旨在专注CV(计算机视觉)、AI(人工智能)领域相关技术,文章内容主要围绕C++、Python编程技术,机器学习(ML)、深度学习(DL)、OpenCV等图像处理技术,深度发掘技术要点,记录学习工作中常用的操作,做你学习工作的问题小助手。只关注技术,做CV领域专业的知识分享平台。
————————————————
 

发布了74 篇原创文章 · 获赞 64 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/wsLJQian/article/details/101108598