关于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之复习if语句
Oct 02 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
May 05 Python
python+Django+apache的配置方法详解
Jun 01 Python
python遍历文件夹下所有excel文件
Jan 03 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python爬虫之遍历单个域名
Nov 20 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
pygame实现弹球游戏
Apr 14 Python
python中列表的含义及用法
May 26 Python
python实现梯度下降算法的实例详解
Aug 17 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
Python 一键获取电脑浏览器的账号密码
May 11 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
1.PHP简介
2006/10/09 PHP
在JavaScript中调用php程序
2009/03/09 PHP
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
PHP 中常量的知识整理
2017/04/14 PHP
js静态作用域的功能。
2006/12/25 Javascript
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
大家未必知道的Js技巧收藏
2008/04/07 Javascript
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
苹果中国官方网站:Apple中国
2016/07/22 全球购物
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
测绘工程本科生求职信
2013/10/10 职场文书
项目申请汇报材料
2014/08/16 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
大学校园招聘会感想
2015/08/10 职场文书
Vue2.0搭建脚手架
2022/03/13 Vue.js
Mysql中常用的join连接方式
2022/05/11 MySQL