详解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 相关文章推荐
Django的数据模型访问多对多键值的方法
Jul 21 Python
详解Python打包分发工具setuptools
Aug 05 Python
python实现画循环圆
Nov 23 Python
Python字符串的修改方法实例
Dec 19 Python
Tensorflow实现多GPU并行方式
Feb 03 Python
Python获取二维数组的行列数的2种方法
Feb 11 Python
python编程进阶之类和对象用法实例分析
Feb 21 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
Mar 06 Python
python 使用递归的方式实现语义图片分割功能
Jul 16 Python
Flask response响应的具体使用
Jul 15 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 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 采集获取指定网址的内容
2010/01/05 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
Jquery 基础学习笔记
2009/05/29 Javascript
JavaScript 函数式编程的原理
2009/10/16 Javascript
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
2017/03/09 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
python将ansible配置转为json格式实例代码
2017/05/15 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
python实现电脑自动关机
2018/06/20 Python
django的ORM模型的实现原理
2019/03/04 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
2014年秋季开学典礼致辞
2014/08/02 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
react中的DOM操作实现
2021/06/30 Javascript
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL