加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

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

发布时间:2019-04-25 05:14:22 所属栏目:建站 来源:佚名
导读:print 函数已老,DeBug 该靠 PySnooper 了~ 小搭档们,你们都奈何 DeBug Python 代码?是不是常用 print 大法?在本文先容的这个项目中,deBug Python 代码再也不必要 print 了。只要给有疑问的代码加上装饰器,各类信息一览无余,找堕落误也就很是简朴了
副问题[/!--empirenews.page--]

 DeBug Python代码端赖print函数?换用这个一天2K+Star的器材吧

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

小搭档们,你们都奈何 DeBug Python 代码?是不是常用 print 大法?在本文先容的这个项目中,deBug Python 代码再也不必要 print 了。只要给有疑问的代码加上装饰器,各类信息一览无余,找堕落误也就很是简朴了。

这个名为 PySnooper 的项目是刚开源的,仅仅一天就得到了 2K+ 的 Star 量,虽然这「一天」还没竣事,这个保藏量也会继承革新。

DeBug Python代码端赖print函数?换用这个一天2K+Star的器材吧

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

Python 奈何 DeBug?

假如写着写着模子,发明模子不 work 了,那么你该奈何找出 Python 的错误语句?这种错误一样平常与语法无关,而是某个变量的运算产生了错误。接下来我们就要逐步找哪个处全部题目了,这里最常见、最直观的要领就是 print 大法。把我们猜疑的变量打印出来,总会找到非常的处所。

假如代码中嵌入了单位测试,譬喻 assert 语句,那么还能缩小一些猜疑范畴。但凡是我们都要多次实行,打印多个变量才气找到错误的处所。在 PyTorch 或 Keras 这样的动态计较图还好,打印出来的直接是一个值,像 TensorFlow 这样的静态计较图,打印出来是张量信息而不是值,这就很忧伤了。

现实上不止是呆板进修,在我们写 Python 的时辰,老是想搞清晰为什么写的代码在运行时有点不大对。许多读者乐于行使断点等成熟的 DeBug 器材,也有的直接行使 print 大法找错误的处所。但此刻我们不必要担忧了,本文将先容一个新的开源器材,它信念满满地号令到:「不要再行使 print 函数来 DeBug 啦~」

极简DeBug器材PySnooper

一样平常环境下,想要知道哪一行代码在运行、哪一行不运行、当地变量的值是几多时,大部门人会行使 print 函数,在要害部门打印某个或某组变量的值、外形、范例等信息。

而 PySnooper 让你能快速地得到这些信息,且对比之下它不必要过细地写 print 函数,只必要向感乐趣的函数增进一个装饰器就行了。我们会获得该函数的具体 log,包括哪行代码能运行、什么时辰运行以及当地变量变革简直切时刻。

对比于其他代码智能器材,PySnooper 为何云云优越?由于不必要任何配置,你就可以在下等、犯科则的企业代码库上行使 PySnooper。只必要加个装饰器,并为日记输出地点指定路径就行了。

这样说也许不太直观,下面我们可以详细看个案例,PySnooper 的优越就能一览无余。

PySnooper 案例

下面项目作者写了一个函数以将数值转换为二进制码,该函数返回的是一个二进制列表。下面我们将装饰器 @pysnooper.snoop() 加到该函数上,就大功告成了。

  1. import pysnooper  
  2. @pysnooper.snoop()  
  3. def number_to_bits(number):  
  4.  if number:  
  5.  bits = []  
  6.  while number:  
  7.  number, remainder = divmod(number, 2)  
  8.  bits.insert(0, remainder)  
  9.  return bits  
  10.  else:  
  11.  return [0]  
  12. number_to_bits(6)  

该函数返回的日记如下,我们可以看到在挪用 number_to_bits 函数时,赋予参数 number 的初始值为 6。然后,PySnooper 就照旧对着源代码一行行说明白。

如上说明所示,函数每建设一个新变量,那么这个变量的值、这个变量的变革城市展示出来。并且 PySnooper 还将轮回睁开,因此变革的细节越发明晰。最终 6 的二进制版本应该是 [1, 1, 0],它的变革进程也展示在 bits 变量中。

此刻通过这些具体信息,PySnooper 再也不消担忧我们用 print 函数强行 deBug 了。

PySnooper 具体特性

假如尺度错误输出难以得到,可能太长了,那么可以将输出定位到当地文件:

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

查察一些非当地变量的值:

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

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

  1. @pysnooper.snoop(depth=2) 

将全部 snoop 行以某个前缀开始,更轻易定位和找到:

  1. @pysnooper.snoop(prefix='ZZZ ') 

演示 PySnooper

下面我们最开始实行行使 PySnooper 获取 TensorFlow 的信息,假如它能获取各类张量信息,那可就太强盛了。

起首行使 pip 安装包:

  1. pip install pysnooper 

公然,TensorFlow 这种静态图并不能很好地获守信息,读者也可实行一下。后头我们试了试 NumPy,但愿能获取整个计较流的信息。如下代码所示,我们建设了两个数组变量,而且 2×2 的矩阵会连乘多次,假如能追踪到这种连乘,那就较量甜头理赏罚错误。

  1. import pysnooper 
  2. import numpy as np 
  3. @pysnooper.snoop() 
  4. def multi_matmul(times): 
  5.  x = np.random.rand(2, 2) 
  6.  w = np.random.rand(2, 2) 
  7.  for i in range(times): 
  8.  x = np.matmul(x, w) 
  9.  return x 
  10. multi_matmul(3) 

对付 NumPy,该器材确实能追踪全部可疑变量的变革进程。虽然在现实运算中,矩阵乘法的维度会很是大,我们可以直接追踪外形(Shape),而不是详细的值。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读