关于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多线程编程中的join函数使用心得
Sep 02 Python
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
Python for循环生成列表的实例
Jun 15 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
在Pandas中处理NaN值的方法
Jun 25 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
python3中rank函数的用法
Nov 27 Python
如何将你的应用迁移到Python3的三个步骤
Dec 22 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
python 利用panda 实现列联表(交叉表)
Feb 06 Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 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
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
JavaScript经典效果集锦
2010/07/06 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
javascript连续赋值问题
2015/07/08 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
微信小程序开发的基本流程步骤
2019/01/31 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
Python中使用item()方法遍历字典的例子
2014/08/26 Python
python实现换位加密算法的示例
2018/10/14 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
SQL Server面试题
2013/04/04 面试题
如何利用cmp命令比较文件
2013/09/23 面试题
教师评优的个人自我评价分享
2013/09/19 职场文书
英文简历中的自荐信范文
2013/12/14 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
交通安全温馨提示语
2015/07/14 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
《红领巾真好》教学反思
2016/02/16 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
Python集合set()使用的方法详解
2022/03/18 Python