详解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中的pprint折腾记
Jan 21 Python
python在linux系统下获取系统内存使用情况的方法
May 11 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
Apr 05 Python
简单实现python数独游戏
Mar 30 Python
python3实现爬取淘宝美食代码分享
Sep 23 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
python内存管理机制原理详解
Aug 12 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
Python爬取梨视频的示例
Jan 29 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 Python
详解分布式系统中如何用python实现Paxos
May 18 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 array_merge下进行数组合并的代码
2008/07/22 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
用ADODB.Stream转换
2007/01/22 Javascript
Z-Blog中用到的js代码
2007/03/15 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
jquery插件之easing使用
2010/08/19 Javascript
javascript写的日历类(基于pj)
2010/12/28 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
JS中取二维数组中最大值的方法汇总
2016/04/17 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
Vue + Elementui实现多标签页共存的方法
2019/06/12 Javascript
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
[02:08:58]2014 DOTA2国际邀请赛中国区预选赛 Ne VS CIS
2014/05/22 DOTA
python列表操作使用示例分享
2014/02/21 Python
pandas值替换方法
2018/07/10 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
python logging.info在终端没输出的解决
2020/05/12 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
Java基础知识面试要点
2016/07/29 面试题
幼儿园家长评语
2014/02/10 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
导游词之无锡梅园
2019/11/28 职场文书