详解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中定义结构体的方法
Mar 04 Python
教你用Python创建微信聊天机器人
Mar 31 Python
python检索特定内容的文本文件实例
Jun 05 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
用python解压分析jar包实例
Jan 16 Python
适合Python初学者的一些编程技巧
Feb 12 Python
使用Tensorboard工具查看Loss损失率
Feb 15 Python
Python运行提示缺少模块问题解决方案
Apr 02 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
Python函数调用追踪实现代码
Nov 27 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
新闻分类录入、显示系统
2006/10/09 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
php实现webservice实例
2014/11/06 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
js评分组件使用详解
2017/06/06 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
python连接mysql调用存储过程示例
2014/03/05 Python
Python中的zip函数使用示例
2015/01/29 Python
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
Python selenium如何设置等待时间
2016/09/15 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
详解Python中第三方库Faker
2020/09/25 Python
女性时尚在线:IVRose
2019/02/23 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
面试求职的个人自我评价
2013/11/16 职场文书
英语专业学生个人求职信范文
2014/01/06 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
平安家庭事迹材料
2014/12/20 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers