详解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变量和数据类型详解
Feb 15 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
Python(Django)项目与Apache的管理交互的方法
May 16 Python
python可视化篇之流式数据监控的实现
Aug 07 Python
wxpython实现按钮切换界面的方法
Nov 19 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 Python
Django admin管理工具TabularInline类用法详解
May 14 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
python中pyplot基础图标函数整理
Nov 10 Python
Python Django搭建文件下载服务器的实现
May 10 Python
这样写python注释让代码更加的优雅
Jun 02 Python
方法汇总:Python 安装第三方库常用
Apr 26 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
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
PHPlet在Windows下的安装
2006/10/09 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
python数字图像处理之高级滤波代码详解
2017/11/23 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
python定时截屏实现
2020/11/02 Python
pandas实现导出数据的四种方式
2020/12/13 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
黄河的主人教学反思
2014/02/07 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
计划生育个人总结
2015/03/02 职场文书
保送生自荐信范文
2015/03/26 职场文书
运动员代表致辞
2015/07/29 职场文书
少儿励志名言(80句)
2019/08/14 职场文书
MySQL 条件查询的常用操作
2022/04/28 MySQL