详解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中Random和Math模块学习笔记
May 18 Python
开始着手第一个Django项目
Jul 15 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
Feb 01 Python
Python语言的变量认识及操作方法
Feb 11 Python
Python中反射和描述器总结
Sep 23 Python
Python rstrip()方法实例详解
Nov 11 Python
解决Python3.5+OpenCV3.2读取图像的问题
Dec 05 Python
python抓取网页内容并进行语音播报的方法
Dec 24 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
Mar 01 Python
Python图像处理之膨胀与腐蚀的操作
Feb 07 Python
Python 多线程处理任务实例
Nov 07 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_flip() 删除重复数组元素专用函数
2010/05/16 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
显示、隐藏密码
2006/07/01 Javascript
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
Python命名空间详解
2014/08/18 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
python使用建议技巧分享(三)
2020/08/18 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
食品营养与检测应届生求职信
2013/11/08 职场文书
安全生产目标责任书
2014/04/14 职场文书
省文明单位申报材料
2014/05/08 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
感谢信
2019/04/11 职场文书
优秀大学生申请书
2019/06/24 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL
基于Redis延迟队列的实现代码
2021/05/13 Redis
详解mysql三值逻辑与NULL
2021/05/19 MySQL