详解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的webrtc库实现语音端点检测
May 31 Python
python登录并爬取淘宝信息代码示例
Dec 09 Python
用python实现的线程池实例代码
Jan 06 Python
python实战教程之自动扫雷
Jul 13 Python
python3 http提交json参数并获取返回值的方法
Dec 19 Python
python实现比较类的两个instance(对象)是否相等的方法分析
Jun 26 Python
对Django 转发和重定向的实例详解
Aug 06 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
python使用pyecharts库画地图数据可视化的实现
Mar 25 Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 Python
Python判断字符串是否为合法标示符操作
Sep 03 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
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
PHP多个版本的分析解释
2011/07/21 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
JS与C#编码解码
2013/12/03 Javascript
jquery等待效果示例
2014/05/01 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
Python @property装饰器原理解析
2020/01/22 Python
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
个人找工作的自我评价
2013/10/17 职场文书
机械工程师的岗位职责
2013/11/17 职场文书
《欢乐的泼水节》教学反思
2014/04/22 职场文书
新郎新娘答谢词
2015/01/04 职场文书
亮剑精神观后感
2015/06/05 职场文书
学生检讨书范文
2019/06/24 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers