关于PySnooper 永远不要使用print进行调试的问题


Posted in Python onMarch 04, 2021

PySnooper 是一个非常方便的调试器。如果您正在试图弄清楚为什么您的Python代码没有按照您的预期去做,您会希望使用具有断点和监视功能的成熟Debug工具,但是许多Debug工具配置起来非常麻烦。

现在,有了PySnooper,您并不需要配置那么复杂的Debug工具,就能够完成对整个代码的分析。它能告诉您哪些代码正在运行,以及局部变量的值是什么。

其实,PySnooper 就是替代了一行一行print的重复性工作,给你的代码一个pysnooper装饰器,它能自动识别到语句和变量并将其值print出来:

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)

效果如下:

Source path:... 1.py
Starting var:.. number = 6
23:03:35.990701 call     4 def number_to_bits(number):
23:03:35.991699 line 5   if number:
23:03:35.991699 line 6     bits = []
New var:....... bits = []
23:03:35.991699 line 7     while number:
23:03:35.991699 line 8       number, remainder = divmod(number, 2)
Modified var:.. number = 3
New var:....... remainder = 0
23:03:35.991699 line 9       bits.insert(0, remainder)
Modified var:.. bits = [0]
23:03:36.004664 line 7     while number:
23:03:36.005661 line 8       number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
23:03:36.005661 line 9       bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
23:03:36.007657 line 7     while number:
23:03:36.007657 line 8       number, remainder = divmod(number, 2)
Modified var:.. number = 0
23:03:36.008655 line 9       bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
23:03:36.008655 line 7     while number:
23:03:36.009651 line 10     return bits
23:03:36.009651 return   10     return bits
Return value:.. [1, 1, 0]
Elapsed time: 00:00:00.020945

可以看到,它将每一行变量的值都输出到屏幕上,方便你调试代码。

仅仅需要写一行代码—使用装饰器就可以实现这个方便的调试功能,比起一行行写print,这可方便多了。

0.安装模块

使用这个模块,你只需要使用Pip安装PySnooper:

pip install pysnooper

接下来讲讲这个模块其他好用的功能:

1.支持日志文件

如果你觉得print到屏幕上不方便,还可以将其输出到log文件中,你只需要将装饰器那一行改为:

@pysnooper.snoop('/my/log/file.log')

2.读取局外变量或其他表达式

如果你想读取在装饰器作用范围以外的变量或者表达式的值,还可以使用watch参数:

@pysnooper.snoop(watch=('foo.bar', 'self.x["whatever"]'))

3.如果你不想用装饰器,也可以用上下文的形式调试

没错,装饰器有限定的使用条件,使用起来比较局限,因此pysnooper还支持使用 with 的上下文形式:

import pysnooper
import random
 
def foo():
  lst = []
  for i in range(10):
    lst.append(random.randrange(1, 1000))
 
  with pysnooper.snoop():
    lower = min(lst)
    upper = max(lst)
    mid = (lower + upper) / 2
    print(lower, mid, upper)
 
foo()

效果如下,只有上下文里的代码才会被调试出来:

New var:....... i = 9
New var:....... lst = [681, 267, 74, 832, 284, 678, ...]
09:37:35.881721 line 10     lower = min(lst)
New var:....... lower = 74
09:37:35.882137 line 11     upper = max(lst)
New var:....... upper = 832
09:37:35.882304 line 12     mid = (lower + upper) / 2
74 453.0 832
New var:....... mid = 453.0
09:37:35.882486 line 13     print(lower, mid, upper)
Elapsed time: 00:00:00.000344

当我们只需要调试部分代码的时候,这个上下文形式的调试方法非常方便。

此外,PySnooper还有许多更强大的用法,大家可以看他们的高级使用文档:

https://github.com/cool-RR/PySnooper/blob/master/ADVANCED_USAGE.md

到此这篇关于PySnooper 永远不要使用print进行调试的文章就介绍到这了,更多相关PySnooper print调试内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用python获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
Python实现树莓派WiFi断线自动重连的实例代码
Mar 16 Python
python3实现ftp服务功能(客户端)
Mar 24 Python
python实现报表自动化详解
Nov 16 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
pandas DataFrame索引行列的实现
Jun 04 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
Python 实现简单的客户端认证
Jul 29 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
Python中使用Lambda函数的5种用法
Apr 01 Python
用python修改excel表某一列内容的操作方法
Jun 11 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 #Python
Pytorch实现WGAN用于动漫头像生成
Mar 04 #Python
基于PyInstaller各参数的含义说明
Mar 04 #Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 #Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
Mar 04 #Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 #Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 #Python
You might like
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
JavaScript中的闭包
2016/02/24 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
python计算时间差的方法
2015/05/20 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
python实现网站微信登录的示例代码
2019/09/18 Python
python处理excel绘制雷达图
2019/10/18 Python
python的range和linspace使用详解
2019/11/27 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
美国五金商店:Ace Hardware
2018/03/27 全球购物
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
Kendra Scott官网:美国领先的时尚配饰品牌
2020/10/22 全球购物
生物制药专业求职信
2014/03/11 职场文书
公开服务承诺制度
2014/03/26 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
老公保证书
2015/01/17 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书