详解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 SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
May 06 Python
Python中有趣在__call__函数
Jun 21 Python
浅谈Python中的闭包
Jul 08 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
Python多线程threading模块用法实例分析
May 22 Python
Python数据分析pandas模块用法实例详解
Nov 20 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
python中tkinter窗口位置\坐标\大小等实现示例
Jul 09 Python
Python实现一个论文下载器的过程
Jan 18 Python
Python多线程 Queue 模块常见用法
Jul 04 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 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 高手之路(一)
2006/10/09 PHP
destoon官方标签大全
2014/06/20 PHP
destoon各类调用汇总
2014/06/20 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
给ECShop添加最新评论
2015/01/07 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
PHP错误处理函数
2016/04/03 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
Jquery 学习笔记(一)
2009/10/13 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
ant design实现圈选功能
2019/12/17 Javascript
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
利用Python查看目录中的文件示例详解
2017/08/28 Python
python for 循环获取index索引的方法
2019/02/01 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
软件配置管理有什么好处
2015/04/15 面试题
音乐表演专业毕业生求职信
2013/10/14 职场文书
霸王洗发水广告词
2014/03/14 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang