关于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发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
Python中的字符串查找操作方法总结
Jun 27 Python
Python中存取文件的4种不同操作
Jul 02 Python
tensorflow使用神经网络实现mnist分类
Sep 08 Python
python求质数的3种方法
Sep 28 Python
anaconda如何查看并管理python环境
Jul 05 Python
Python使用type关键字创建类步骤详解
Jul 23 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
详解Python IO编程
Jul 24 Python
Python filter过滤器原理及实例应用
Aug 18 Python
python 爬取天气网卫星图片
Jun 07 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
Numpy的简单用法小结
2019/08/28 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
使用python远程操作linux过程解析
2019/12/04 Python
Python多进程编程multiprocessing代码实例
2020/03/12 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
自荐信包含哪些内容
2013/10/30 职场文书
高中自我评价范文
2014/01/27 职场文书
中等生评语大全
2014/05/04 职场文书
工作岗位说明书模板
2014/05/09 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
质量保证书怎么写
2015/02/27 职场文书
2015年计划生育责任书
2015/05/08 职场文书
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python