详解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连接mysql数据库示例(做增删改操作)
Dec 31 Python
python实现超简单端口转发的方法
Mar 13 Python
python使用正则表达式提取网页URL的方法
May 26 Python
Python读取Excel的方法实例分析
Jul 11 Python
学习python类方法与对象方法
Mar 15 Python
Python中生成Epoch的方法
Apr 26 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 Python
python多任务及返回值的处理方法
Jan 22 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
使用Python 自动生成 Word 文档的教程
Feb 13 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
Mar 17 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 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保留两位小数的几种方法
2019/07/24 PHP
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
微信小程序配置服务器提示验证token失败的解决方法
2019/04/03 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
python 提取文件的小程序
2009/07/29 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
电钳工人个人求职信
2014/05/10 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
2014年消防工作总结
2014/11/21 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
出生证明格式
2015/06/15 职场文书