详解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 生成目录树及显示文件大小的代码
Jul 23 Python
python中的多重继承实例讲解
Sep 28 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
Python栈类实例分析
Jun 15 Python
Numpy之random函数使用学习
Jan 29 Python
将python文件打包成EXE应用程序的方法
May 22 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
使用OpenCV实现道路车辆计数的使用方法
Jul 15 Python
如何使用python自带IDLE的几种方法
Oct 10 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 24 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
IStream与TStream之间的相互转换
2008/08/01 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
vue axios 简单封装以及思考
2018/10/09 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
Python2随机数列生成器简单实例
2017/09/04 Python
python使用udp实现聊天器功能
2018/12/10 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
司机辞职报告范文
2014/01/20 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
商业街策划方案
2014/05/31 职场文书
龙门石窟导游词
2015/02/02 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
教学工作总结范文5篇
2019/08/19 职场文书