关于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的三目运算符和not in运算符使用示例
Mar 03 Python
Python中unittest模块做UT(单元测试)使用实例
Jun 12 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
Numpy之random函数使用学习
Jan 29 Python
Win10 安装PyCharm2019.1.1(图文教程)
Sep 29 Python
Python 下载及安装详细步骤
Nov 04 Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 Python
Python基础教程之输入输出和运算符
Jul 26 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
Dec 23 Python
教你怎么用python实现字符串转日期
May 24 Python
linux中nohup和后台运行进程查看及终止
Jun 24 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 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+MSSQL分页的例子
2006/10/09 PHP
php 数据库字段复用的基本原理与示例
2011/07/22 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
Vue学习笔记之表单输入控件绑定
2017/09/05 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python创建xml的方法
2015/03/10 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
Python tkinter label 更新方法
2018/10/11 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
python Canny边缘检测算法的实现
2020/04/24 Python
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
企业行政文员岗位职责
2013/12/03 职场文书
上课迟到检讨书100字
2014/01/11 职场文书
教师教学评估方案
2014/05/09 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
会计主管岗位职责
2015/04/02 职场文书
小学工作总结2015
2015/05/04 职场文书
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python