详解DeBug Python神级工具PySnooper


Posted in Python onJuly 03, 2019

PySnooper 在 GitHub 上自嘲是一个“乞丐版”调试工具(poor man's debugger)。

一般情况下,在编写 Python 代码时,如果想弄清楚为什么 Python 代码没有按照预期执行、哪些代码在运行哪些没在运行、局部变量又是什么,我们会使用包含断点和观察模式等功能的调试器,或者直接使用 print 语句打印出来。

但上面的方法都比较麻烦,例如使用调试器需要进行繁琐的设置,使用 print 打印也要很仔细。与它们相比,使用 PySnooper 只需为要调试的函数添加一个装饰器即可,这样就能获得运行函数详细的 log,包括执行的代码行和执行时间,以及局部变量发生变化的确切时间。

之所以称为“乞丐版”,相信是因为 PySnooper 使用起来十分简单,开发者可以在任何庞大的代码库中使用它,而无需进行任何设置。只需添加装饰器,并为日志输出地址指定路径。

GitHub项目地址

安装

pip3 install pysnooper
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)

返回日志如下

Starting var:.. number = 6
21:14:32.099769 call         3 @pysnooper.snoop()
21:14:32.099769 line         5     if number:
21:14:32.099769 line         6         bits = []
New var:....... bits = []
21:14:32.099769 line         7         while number:
21:14:32.099769 line         8             number, remainder = divmod(number, 2)
New var:....... remainder = 0
Modified var:.. number = 3
21:14:32.099769 line         9             bits.insert(0, remainder)
Modified var:.. bits = [0]
21:14:32.099769 line         7         while number:
21:14:32.099769 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
21:14:32.099769 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
21:14:32.099769 line         7         while number:
21:14:32.099769 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 0
21:14:32.099769 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
21:14:32.099769 line         7         while number:
21:14:32.099769 line        10         return bits
21:14:32.099769 return      10         return bits

PySnooper特征

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

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

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

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

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

@pysnooper.snoop(depth=2)

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

@pysnooper.snoop(prefix='ZZZ ')

更可以用来获取TensorFlow 的各种张量信息,十分强大。妈妈再也不用担心我找不到bug啦!
(2019.5.7更新:有时会不起作用,不知是自己姿势不对还是其他原因。)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现排序算法
Feb 14 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
Apr 21 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
Python 做曲线拟合和求积分的方法
Dec 29 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
python matplotlib实现将图例放在图外
Apr 17 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
Python pip安装第三方库实现过程解析
Jul 09 Python
python 读取yaml文件的两种方法(在unittest中使用)
Dec 01 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 Python
python获取带有返回值的多线程
May 02 Python
python神经网络ResNet50模型
May 06 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 #Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 #Python
在cmd中查看python的安装路径方法
Jul 03 #Python
python动态进度条的实现代码
Jul 03 #Python
OpenCV 轮廓检测的实现方法
Jul 03 #Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 #Python
Python Pandas数据结构简单介绍
Jul 03 #Python
You might like
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
php adodb分页实现代码
2009/03/19 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
php微信开发之关注事件
2018/06/14 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
理解Python垃圾回收机制
2016/02/12 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
python对excel文档去重及求和的实例
2018/04/18 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
日本高岛屋百货购物网站:TAKASHIMAYA
2019/03/24 全球购物
副科级后备干部考察材料
2014/05/15 职场文书
爱心捐款感谢信
2015/01/20 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python