详解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获取脚本所在目录的正确方法
Apr 15 Python
Python中分数的相关使用教程
Mar 30 Python
Python回调函数用法实例详解
Jul 02 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
python编程嵌套函数实例代码
Feb 11 Python
pandas修改DataFrame列名的方法
Apr 08 Python
python实现自动解数独小程序
Jan 21 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
Python描述符descriptor使用原理解析
Mar 21 Python
Python使用sqlite3模块内置数据库
May 07 Python
DRF框架API版本管理实现方法解析
Aug 21 Python
python实现计算图形面积
Feb 22 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根据日期判断星座的函数分享
2014/02/13 PHP
PHP速成大法
2015/01/30 PHP
解决nginx不支持thinkphp中pathinfo的问题
2015/07/21 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
python中的闭包用法实例详解
2015/05/05 Python
Python使用multiprocessing创建进程的方法
2015/06/04 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
物流管理专业毕业生求职信
2014/03/23 职场文书
合作协议书怎么写
2014/04/18 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
勇敢的心观后感
2015/06/09 职场文书
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python