关于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做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
Python实现抢购IPhone手机
Feb 07 Python
Python实现的redis分布式锁功能示例
May 29 Python
python开发准备工作之配置虚拟环境(非常重要)
Feb 11 Python
python批量创建指定名称的文件夹
Mar 21 Python
python批量修改ssh密码的实现
Aug 08 Python
详解Python time库的使用
Oct 10 Python
10个Python面试常问的问题(小结)
Nov 20 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
Django中从mysql数据库中获取数据传到echarts方式
Apr 07 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
linux系统下pip升级报错的解决方法
Jan 31 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学习之变量的使用
2011/05/29 PHP
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
PHP创建单例后台进程的方法示例
2017/05/23 PHP
mysqli扩展无法在PHP7下升级问题的解决
2019/09/10 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
详解Vite的新体验
2021/02/22 Javascript
[45:15]Optic vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
python字符串格式化方式解析
2019/10/19 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
什么是GWT的Module
2013/01/20 面试题
外贸业务员的岗位职责
2013/11/23 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
作风转变心得体会
2014/09/02 职场文书
西岭雪山导游词
2015/02/06 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
zabbix监控mysql的实例方法
2021/06/02 MySQL