分享

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

 copy_left 2019-10-14

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

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

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

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

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

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

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

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

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

print('Hello World')

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

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

1.如果要打印的信息比较多,就需要写很多行的Print语句;2.在调试结束后,往往还需要逐一删除这些语句。这是一个繁琐的过程。一言以蔽之,使用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))

输出打印的结果,如下:

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

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

2.pysnooper神器的打印方式

PySnooper - Never use print for debugging again

上面一句是引用自Github中pysnooper作者在介绍中的代言句,“再也不用print去debug了”,pysnooper---英文解释是“刺探者,实时录音软件”,名字和它的功能一样,像一个窥探者似的,记录下了整个运行的日志过程。

接下来,我们就直接将章节1中的代码print部分注释掉,其余部分不变,增加pysnooper部分,看看声称要取代print进行代码调试的它究竟有多么的强大。如下

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

打印结果如下:

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

  1. 色框部分,是该debug的时候,运行到哪一行了

  2. 蓝色、绿色、黄色框,则是运行过程中参数的值

  3. 红色框右侧则是运行到该行,执行的代码行

上面执行的这些,也就和在章节1中自行打印的参数值内容一致,采用pysnooper方法会更加的直观如果你不容易访问stderr,你可以重定向输出保存到一个文件中:

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

定义函数部分是一样的,然后运行,查看file.log,内容如下:

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

仔细的查看每一行打印的日志内容,就可以知道此时运行到哪一行了,以及该行的代码详细内容,和当前参数的值。最后,送上安装方式,也是非常的简单,不报错。

pip install pysnooper

如果出现安装超时的情况,多半是由于你安装源的问题,这里我们就可以切换到国内的安装源进行尝试下。如下,切换到豆瓣的安装源(该方法同样适用于以后的第三方库的安装过程):

pip install pysnooper -i https://pypi.douban.com/simple

作者很用心的列举了很多的例子,限于篇幅不一一介绍了。更多的关于pysnooper的内容,可直接去大佬github查看,现在已经12.6K赞啦:https://github.com/cool-RR/PySnooper

好用,就赶紧收藏起来吧。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多