关于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绘制人人网好友关系图示例
Apr 01 Python
遗传算法之Python实现代码
Oct 10 Python
详解python字节码
Feb 07 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
用pycharm开发django项目示例代码
Oct 24 Python
python实现贪吃蛇小游戏
Mar 21 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
利用Python校准本地时间的方法教程
Oct 31 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
python利用xlsxwriter模块 操作 Excel
Oct 14 Python
Selenium 配置启动项参数的方法
Dec 04 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 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
ip签名探针
2006/10/09 PHP
关于页面优化和伪静态
2009/10/11 PHP
php jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
python 文件操作api(文件操作函数)
2016/08/28 Python
简单实现Python爬取网络图片
2018/04/01 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
django 类视图的使用方法详解
2019/07/24 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
Python的信号库Blinker用法详解
2020/12/31 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
海飞丝的广告词
2014/03/20 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python