详解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使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
神经网络python源码分享
Dec 15 Python
python如何读写json数据
Mar 21 Python
对Python 2.7 pandas 中的read_excel详解
May 04 Python
python版DDOS攻击脚本
Jun 12 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
python通过实例讲解反射机制
Oct 17 Python
pytorch进行上采样的种类实例
Feb 18 Python
如何使用python切换hosts文件
Apr 29 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
Python insert() / append() 用法 Leetcode实战演示
Mar 31 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
用php过滤危险html代码的函数
2008/07/22 PHP
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
浅析python中的分片与截断序列
2016/08/09 Python
Python中的 is 和 == 以及字符串驻留机制详解
2019/06/28 Python
Django 再谈一谈json序列化
2020/03/16 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
公司司机岗位职责范本
2014/03/03 职场文书
国培计划培训感言
2014/03/11 职场文书
幼儿园运动会口号
2014/06/07 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS