DeBug Python代码全靠print函数?换用这个一天2K+Star的工具吧

print 函数已老,DeBug 该靠 PySnooper 了~

小伙伴们,你们都怎样 DeBug Python 代码?是不是常用 print 大法?在本文介绍的这个项目中,deBug Python 代码再也不需要 print 了。只要给有疑问的代码加上装饰器,各种信息一目了然,找出错误也就非常简单了。

这个名为 PySnooper 的项目是刚开源的,仅仅一天就获得了 2K+ 的 Star 量,当然这「一天」还没结束,这个收藏量也会继续刷新。

项目地址:https://github.com/cool-RR/pysnooper

Python 怎样 DeBug?

如果写着写着模型,发现模型不 work 了,那么你该怎样找出 Python 的错误语句?这种错误一般与语法无关,而是某个变量的运算发生了错误。接下来我们就要慢慢找哪个地方有问题了,这里最常见、最直观的方法就是 print 大法。把我们怀疑的变量打印出来,总会找到异常的地方。

如果代码中嵌入了单元测试,例如 assert 语句,那么还能缩小一些怀疑范围。但通常我们都要多次尝试,打印多个变量才能找到错误的地方。在 PyTorch 或 Keras 这样的动态计算图还好,打印出来的直接是一个值,像 TensorFlow 这样的静态计算图,打印出来是张量信息而不是值,这就很尴尬了。

实际上不止是机器学习,在我们写 Python 的时候,总是想搞清楚为什么写的代码在运行时有点不大对。很多读者乐于使用断点等成熟的 DeBug 工具,也有的直接使用 print 大法找错误的地方。但现在我们不需要担心了,本文将介绍一个新的开源工具,它信心满满地呼吁到:「不要再使用 print 函数来 DeBug 啦~」

学习Python中的小伙伴,需要学习资料的话,可以前往我的微信公众号:速学Python,后台回复:简书,即可拿Python学习资料

这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。送给正在学习python的小伙伴!这里是python学习者聚集地,欢迎初学和进阶中的小伙伴!

极简DeBug工具PySnooper

一般情况下,想要知道哪一行代码在运行、哪一行不运行、本地变量的值是多少时,大部分人会使用 print 函数,在关键部分打印某个或某组变量的值、形状、类型等信息。

而 PySnooper 让你能快速地获得这些信息,且相比之下它不需要细致地写 print 函数,只需要向感兴趣的函数增加一个装饰器就行了。我们会得到该函数的详细 log,包含哪行代码能运行、什么时候运行以及本地变量变化的确切时间。

相比于其他代码智能工具,PySnooper 为何如此优秀?因为不需要任何设置,你就可以在劣等、不规则的企业代码库上使用 PySnooper。只需要加个装饰器,并为日志输出地址指定路径就行了。

这样说可能不太直观,下面我们可以具体看个案例,PySnooper 的优秀就能一目了然。

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)

该函数返回的日志如下,我们可以看到在调用 number_to_bits 函数时,赋予参数 number 的初始值为 6。然后,PySnooper 就还是对着源代码一行行分析了。

如上分析所示,函数每创建一个新变量,那么这个变量的值、这个变量的变化都会展示出来。而且 PySnooper 还将循环展开,因此变化的细节更加明确。最终 6 的二进制版本应该是 [1, 1, 0],它的变化过程也展示在 bits 变量中。

现在通过这些详细信息,PySnooper 再也不用担心我们用 print 函数强行 deBug 了。

PySnooper 详细特征

如果标准错误输出难以获得,或者太长了,那么可以将输出定位到本地文件:

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

查看一些非本地变量的值:

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

展示我们函数中调用函数的 snoop 行:

@pysnooper.snoop(depth=2)

将所有 snoop 行以某个前缀开始,更容易定位和找到:

@pysnooper.snoop(prefix='ZZZ ')

演示 PySnooper

下面我们最开始尝试使用 PySnooper 获取 TensorFlow 的信息,如果它能获取各种张量信息,那可就太强大了。

首先使用 pip 安装包:

pip install pysnooper

果然,TensorFlow 这种静态图并不能很好地获取信息,读者也可尝试一下。后面我们试了试 NumPy,希望能获取整个计算流的信息。如下代码所示,我们创建了两个数组变量,并且 2×2 的矩阵会连乘多次,如果能追踪到这种连乘,那就比较好处理错误。

import pysnooper

import numpy as np

@pysnooper.snoop()

def multi_matmul(times):

x = np.random.rand(2, 2)

w = np.random.rand(2, 2)

for i in range(times):

x = np.matmul(x, w)

return x

multi_matmul(3)

对于 NumPy,该工具确实能追踪所有可疑变量的变化过程。当然在实际运算中,矩阵乘法的维度会非常大,我们可以直接追踪形状(Shape),而不是具体的值。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容