关于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里disconnect UDP套接字的方法
Apr 23 Python
利用Python开发实现简单的记事本
Nov 15 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
快速了解Python中的装饰器
Jan 11 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
python 自定义异常和异常捕捉的方法
Oct 18 Python
python 搜索大文件的实例代码
Jul 08 Python
使用pandas读取文件的实现
Jul 31 Python
一行Python代码过滤标点符号等特殊字符
Aug 12 Python
python字符串的拼接方法总结
Nov 18 Python
django自带的权限管理Permission用法说明
May 13 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
Oct 19 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入门学习知识点三 PHP上传
2011/07/14 PHP
PHP中比较时间大小实例
2014/08/21 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
2014/08/24 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
jQuery实用技巧必备(上)
2015/11/02 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
Python实现的数据结构与算法之队列详解
2015/04/22 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
使用python模拟高斯分布例子
2019/12/09 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
医护人员英文求职信范文
2013/11/26 职场文书
田径运动会开幕式及主持词
2014/03/28 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
销售员试用期自我评价
2014/09/15 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
专家推荐信怎么写
2015/03/25 职场文书
python保存图片的四个常用方法
2022/02/28 Python
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS