首页 文章详情

推荐一个Python debug神器:PySnooper

Python大数据分析 | 142 2022-07-05 16:50 0 0 0
UniSMS (合一短信)

debug是码农们的基本技能,每个人都有自己擅长(习惯)的debug手段,比如虾神年轻的时候,曾经在ms-dos平台上写过几行C语言代码,那个时代,IDE是这个样子的:


后来还用过几天Turbo C,是这个样子的:

在这种IDE下面,debug是一种极度痛苦的事情,所以就养成了print调试的习惯:所有的编程语言debug手段,都基于这两种:
1、打印关键变量跟踪调试。
2、打断点步进调试。

比如虾神才毕业的时候,还写过几天javascript,那个时代没有专用的IDE,也没有专用的JS调试工具,所以调试的时候,满页面写满alert……
(我一直觉得这个提示充满了浓浓的恶意……)

后来,到了写Python的时候,各种IDE已经很成熟了,但是一直养成习惯,老让我不自觉的时候在debug的时候,写满了print,然后打包发布的时候,清理代码搞得焦头烂额。

一般来说,调试还是通过IDE进行断点步进,效率是最高的,效果也是最好,但是,很多时候,print有着不可替代的作用,比如远程在linux上用过shell调试Python脚本的时候;又如在jupyter notebook需要进行调试的时候;再如用Pandas的apply函数的时候;断点都不用好,更不用说,多线程编程的时候,断点调试基本上就是被废掉了。

直到我后面发现了一个Python的debug神包:pysnooper

可能老Python码农们早就用上这个工具包,不过鉴于虾神的读者,还是以GIS圈子的同学比较多,所以觉得还有必要给大家推介一下这个神奇的debug工具。

如下所示:
安装,非常简单,直接pip。

使用,就更简单了,导入,然后写一个装饰器(不知道啥是装饰器的同学,去参考其他文章,如果懒得去了解,就硬记下来这样用就行):


方法很简单,求素数(啥叫素数,自己去放小学数学)。

(PS:素数是数论里面一个很有意思的问题,它在逐步计算到它自身之前,都无法判断,只能逐步迭代,没有快速判定,用数学家的说法:素数随机的出现在数轴上,无法预先判定,素数号称数论的皇冠,各种数学大佬们们都对它进行了研究,恐怖如斯……)

当我们运行的时候,会出现这样的debug内容:

从100计算到200,第一轮循环的时候,i = 100,当 j = 2的时候,flag就已经等于false,跳出循环。
然后第二轮循环,i = 101,j =2开始,一直到sqrt(101)+1,也就是2-11,迭代之后,发现都没有因子,所以得到101是素数,加入到p这个List中:


从以上debug输出结果可以看出,PySnooper输出信息主要包括以下几个部分:
  • 局部变量值

  • 代码片段

  • 局部变量所在行号

  • 返回结果


也就是说,把我们日常DEBUG所需要的主要信息都输出出来了。而且还有运行的时间,这样还可以用来调试代码效率。
当然,你也可以选择输出成日志,这样还可以后续分析,比如:


可以得到这样一个log文件:


当然,为了区别多个function,也可以加前缀:

结果如下:


当然,还有一系列参数可用,大家可以自行探索:


打完收工。

加入知识星球【我们谈论数据科学】

500+小伙伴一起学习!








· 推荐阅读 ·

geopandas轻松绘制交互式在线地图

地图可视化:geopandas绘制拓扑着色地图

新一代Python包管理工具来了



good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter