详解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+OpenCV人脸检测原理及示例详解
Oct 19 Python
python监控进程脚本
Apr 12 Python
python 删除指定时间间隔之前的文件实例
Apr 24 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
python调用外部程序的实操步骤
Mar 04 Python
python用match()函数爬数据方法详解
Jul 23 Python
python KNN算法实现鸢尾花数据集分类
Oct 24 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
Python 数据分析之逐块读取文本的实现
Dec 14 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
改造一台复古桌面收音机
2021/03/02 无线电
实用函数2
2007/11/08 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
jquery实现从数组移除指定的值
2015/06/24 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
解析Python中while true的使用
2015/10/13 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
详解Django的CSRF认证实现
2018/10/09 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
精彩的广告词
2014/03/19 职场文书
学生党员检讨书范文
2014/12/27 职场文书
工作岗位职责范本
2015/02/15 职场文书
生产车间主任岗位职责
2015/04/08 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
小学四年级作文之写景
2019/08/23 职场文书
Win11软件图标固定到任务栏
2022/04/19 数码科技