关于PySnooper 永远不要使用print进行调试的问题

 更新时间:2021年03月04日 10:42:17   作者:Python实用宝典  
这篇文章主要介绍了关于PySnooper 永远不要使用print进行调试的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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接口,继承,重载运算符详解

    这篇文章主要给大家介绍了关于Python接口,继承,重载运算符的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们参考借鉴,下面随着小编来一起学习学习吧
    2021-08-08
  • python爬虫入门教程--正则表达式完全指南(五)

    python爬虫入门教程--正则表达式完全指南(五)

    要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于split,substring等等就足够了,可是涉及到比较复杂的匹配,当然是正则的天下,下面这篇文章主要给大家介绍了python爬虫之正则表达式的相关资料,需要的朋友可以参考下。
    2017-05-05
  • Python实现switch/case语句

    Python实现switch/case语句

    与Java、C\C++等语言不同,Python中是不提供switch/case语句的,这一点让我感觉到很奇怪。我们可以通过如下几种方法来实现switch/case语句
    2021-08-08
  • Python利用pyodbc库将文件信息插入Access数据库

    Python利用pyodbc库将文件信息插入Access数据库

    在日常编程工作中,我们经常需要处理文件和文件夹,所以本文将介绍如何使用Python编程语言和wxPython库创建一个简单的文件浏览器界面,使用户能够选择文件夹并将文件信息插入到Access数据库中,需要的可以参考下
    2023-08-08
  • 详解django使用include无法跳转的解决方法

    详解django使用include无法跳转的解决方法

    这篇文章主要介绍了详解django使用include无法跳转的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Python中的response.text与content区别详解

    Python中的response.text与content区别详解

    这篇文章主要介绍了Python中的response.text与content区别详解, 从网络请求下来的数据,他们都是字节类型的,如果服务器不指定的话,默认编码是"ISO-8859-1",我们使用text直接拿到的是字符串类型,没有进行解码操作,则会出现乱码问题,需要的朋友可以参考下
    2023-12-12
  • Python打印不合法的文件名

    Python打印不合法的文件名

    这篇文章主要介绍了Python打印不合法的文件名,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下的相关资料
    2020-07-07
  • python之class类和方法的用法详解

    python之class类和方法的用法详解

    这篇文章主要介绍了python中class类和方法的用法详解,如果有不太清楚面向对象的类和方法的编程思想的小伙伴可以借鉴参考本文
    2023-03-03
  • Python竟能画这么漂亮的花,帅呆了(代码分享)

    Python竟能画这么漂亮的花,帅呆了(代码分享)

    这篇文章主要介绍了用Python作图的一个简单实例,通过turtle模块实现作图,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 对python实现模板生成脚本的方法详解

    对python实现模板生成脚本的方法详解

    今天小编就为大家分享一篇对python实现模板生成脚本的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01

最新评论