百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

一文带您了解PySnooper:让码农告别Python print函数

liuian 2025-05-28 18:44 107 浏览

在我们之前的文章《一文带您了解IceCream:码农的Python代码调试神器,告别print()》,我们介绍了IceCream替代print进行代码调试的示例。今天,受到粉丝推荐的启发,我们将介绍另一个类似的Python代码调试包:PySnooper。

在编程过程中,调试通常是一项痛苦的任务,而使用传统的print语句进行调试往往更加繁琐。为了摆脱这种痛点,我们将直接介绍PySnooper,一款强大的代码调试工具。

我们首先看看PySnooper 官方介绍:https://github.com/cool-RR/PySnooper

PySnooper:再也不用为调试而使用print了

PySnooper是一个简易的调试工具。如果你曾经使用过Bash,它就像是Python的set -x命令,只不过更加高级。

你的情景:你试图弄清楚为什么你的Python代码不按照你预期的那样工作。你很想使用一个带有断点和监视功能的完整调试器,但是你现在懒得设置一个。

你想知道哪些代码行在运行,哪些没有运行,以及本地变量的值是什么。

大多数人会在关键位置使用print语句,其中一些显示变量的值。

PySnooper让你可以做同样的事情,但是你不需要精心编写正确的print语句,只需要在你感兴趣的函数上添加一个装饰器。你将得到你的函数的逐步日志,包括哪些行运行了以及何时运行,以及本地变量何时发生了变化。

PySnooper的独特之处在于什么?你可以在你那些糟糕、庞大的企业代码库中使用它,而无需进行任何设置。只需将装饰器添加到函数上,并将输出重定向到一个专用的日志文件,指定其路径作为第一个参数即可。

安装PySnooper

pip install pysnooper

第一个示例

我们正在编写一个将数字转换为二进制的函数,通过返回一个位列表来完成。让我们通过添加@pysnooper.snoop()装饰器来进行监视:

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)

如果你不想追踪整个函数,你可以将相关部分包装在一个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()

PySnooper特性

PySnooper拥有许多功能,使其成为调试Python代码的一款多才多艺且实用的工具。以下是一些您应该了解和使用的顶级特性:

  • 定制PySnooper的输出。您可以通过在装饰器中使用不同的参数来定制PySnooper的输出,例如depth、prefix、file、watch等。例如,您可以使用depth来限制PySnooper跟踪的嵌套调用数量,或者使用watch来添加您想要监视的表达式。您可以在文档中找到参数的完整列表和描述。
  • 在任何Python代码、环境或框架中使用PySnooper。您可以在任何Python代码中使用PySnooper,包括第三方库、模块和包。您还可以在任何Python环境中使用它,例如Jupyter笔记本、脚本或交互式shell。您还可以在任何Python框架中使用PySnooper,例如Django、Flask、PyTorch、TensorFlow、PyTest、PyInstaller、PyGame、NumPy、Pandas、Scrapy、Matplotlib、SQLAlchemy等等。
  • 在多线程、多进程或异步代码中使用PySnooper。您可以通过在装饰器中使用thread_info或process_info参数来使用PySnooper调试多线程或多进程代码。这将在输出中添加线程或进程ID,以便您区分不同的线程或进程。您还可以使用PySnooper调试异步代码,只需使用@pysnooper.snoop_async()装饰器,而不是常规的装饰器。这将与任何异步框架一起使用,例如asyncio、trio或curio。
  • 在lambda函数、生成器、推导式和其他复杂表达式中使用PySnooper。您可以通过使用pysnooper.snoop函数而不是装饰器来调试lambda函数、生成器、推导式和其他复杂表达式。这将返回一个包装函数,您可以使用与原始函数相同的参数调用它。

像这样调试一个lambda函数:

import pysnooper


squared = pysnooper.snoop()(lambda x: x ** 2)
squared(5)

将日志输出到文件:

import pysnooper


@pysnooper.snoop('file.log')
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)

设置环境变量PYSNOOPER_DISABLED 为1 ,关闭debug 输出:

import os
os.environ['PYSNOOPER_DISABLED'] = '1'


import pysnooper


@pysnooper.snoop()
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)


factorial(5)

以一个前缀开头,方便使用grep查找所有的snoop行:

import pysnooper


@pysnooper.snoop(prefix='SNB ')
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)


factorial(5)

删除所有与机器相关的数据(路径、时间戳、内存地址),以便轻松地与其他跟踪进行比较:

import pysnooper


@pysnooper.snoop(normalize=True)
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)


factorial(5)

PySnooper的优势

PySnooper拥有许多优势,使其成为调试Python代码的绝佳工具。以下是其中一些:

  • PySnooper易于使用,无需设置或配置。您只需要导入它,并在您想要调试的函数或方法上添加一个装饰器。您无需学习任何命令或语法,也无需以任何方式修改您的代码。
  • PySnooper速度快且轻量级。它不会减慢您的代码,也不会增加任何额外的开销。它只会打印出您调试代码所需的相关信息,而不会多余打印。
  • PySnooper灵活且可定制。您可以通过在装饰器中使用不同的参数来调整PySnooper的输出,例如depth、prefix、file、watch等。您还可以在任何Python代码、环境或框架中使用PySnooper,包括多线程、多进程和异步代码。
  • PySnooper具有教育性和趣味性。它可以帮助您了解您的代码如何工作,找到错误,优化性能,并从其他人的代码中学习。它还可以使调试更加愉快,减少沮丧感,因为它向您展示了代码背后的魔力。


PySnooper是一款强大的Python代码调试工具,易于使用且无需配置。它能快速精准地定位问题,定制输出内容,并适用于各种Python环境和框架。通过添加装饰器,您可以轻松监视函数执行情况,而无需繁琐的print语句。PySnooper的灵活性和教育性使得调试变得更加高效愉快,为开发者提供了更好的调试体验。

相关推荐

开机蓝屏0x000000ed(开机蓝屏0x0000007b怎么解决)

停止代码0x000000ED蓝屏错误,通常称为“UNMOUNTABLE_BOOT_VOLUME”,表示计算机在尝试访问或加载操作系统时遇到问题。这通常是由硬盘驱动器或文件系统损坏引起的,也可能是由...

ps软件在线使用(ps在线工具)

?选择工具是最基本的PS工具之一,具有对图层进行移动和对齐的功能,工具栏上是个亿带十字的箭头图标(区别于路径选择工具,后者是一个标准的箭头图标)。?在使用PS工具的时候,我们要注意鼠标状态的变...

win7平板电脑(win7平板电脑好用吗)

方法一:平板模式只需在操作中心快速切换:1、点击右下角的操作中心图标,在弹出的窗口中点击“平板模式”实现开启或关闭;2、如此一来就能轻松实现平板模式和桌面模式的快速切换了。方法二:系统设置修改1...

windowsxp是哪一年发布的(windowsxp是什么时候发布的)

WindowsXP是微软公司研发的计算机操作系统,于2001年10月25日正式发布。其名字中“XP”的意思来自英文中的“体验”(Experience)。[1][2]WindowsXP使用了Luna...

win8没有无线网络连接(win8无线设备没有wifi)

当Win8.1的网络连接不可用时,您可以尝试以下几种方法来解决问题:1.检查物理连接:确保网络电缆正确连接到计算机和路由器/调制解调器。如果使用的是无线网络,请确保无线适配器已启用,并且与正确的网络...

手机系统重装教程(手机系统如何重装系统)
手机系统重装教程(手机系统如何重装系统)

手机怎么重装系统?1首先我们是需要做好个人数据的备份的,只要做好联系人,文件夹,重要的软件和照片的备份,使用专业的备份软件就可以,我们找到设置然后找到云服务点击进去然后就会有一个云备份,再点进去有个立即备份。2第二个条件就是手机一定要有充足...

2026-01-09 04:55 liuian

笔记本触摸板没反应怎么办(笔记本电脑触摸板没反应怎么回事)
笔记本触摸板没反应怎么办(笔记本电脑触摸板没反应怎么回事)

您可以尝试按下触摸板上方的Fn键加上触摸板功能键来恢复触摸板反应。如果这个方法不行的话,您可以尝试更换电脑驱动或进行一些基础维护来解决问题。触摸板没有反应可能是因为触摸板驱动或者硬件出现问题,还有可能是触摸板出现灰尘卡住,需要进行清理维护。...

2026-01-09 04:05 liuian

gpt和mbr的区别哪个好(gpt和mbr性能有差距吗)

GPT格式相较于MBR格式有更多的优点。首先,GPT扩展了分区表的大小,支持更多的分区。其次,GPT支持更大的硬盘容量,能够管理超过2TB的硬盘。另外,GPT对于数据备份和恢复也更加方便,而且更加稳定...

cmd清理垃圾命令代码(cmd清除垃圾命令)

1、首先“windows”键+“R”,当然不一定是大写,这里是为了突出2、其次,输入“cmd”,按下回车键或者点击上面的“确定”按钮3、进入控制台窗口之后,输入“cleanmgr”,按下回车键“ent...

双系统没有引导界面(双系统 没有引导)

安装有winPE系统的U盘无法进安装系统界面的原因通常有如下几点:1)BIOS中开启了secureboot若BIOS中开启了secureboot项目,winPE系统是无法引导进入的,此时需先进入BIO...

电脑运行速度慢怎么办(电脑运行速度慢咋办)

清理电脑桌面电脑桌面上的东西越少越好,东西多了占系统资源。虽然在桌面上方便些,但是要付出占用系统资源和牺牲速度的代价。解决办法:①将桌面上快捷方式都删了,因为这些在“开始”菜单和“程序”栏里都有。②将...

foxmail和qq邮箱的关系(foxmail邮箱和outlook)

是的,QQ邮箱和Foxmail邮箱是一个团队开发的就是原来的Foxmail客户端开发团队不过被腾讯收购了所以,我们看的的QQ邮箱和Foxmail邮箱是一样的。只是Foxmail功能少的点,而切也不够出...

电脑如何创建虚拟光驱(如何建立虚拟光驱)

虚拟光驱是一种软件,可以模拟实体光盘,使得用户可以在没有实体光盘的情况下使用光盘的功能,如安装应用程序、游戏等。下面是安装虚拟光驱的一般步骤:1.选择一个虚拟光驱软件,比如VirtualClone...

360怎么修复u盘(用360怎么修复u盘)

如果是有盘符而没有显示出来的:右击我的电脑/管理/存储/磁盘管理,然后右击“可移动磁盘”图标”单击快捷菜单中的“更改驱动器和路径”选项,并在随后的界面中单击“添加”按钮,接下来选中“指派驱动器号”,同...

cad2025永久激活密钥(cad2016激活密钥)

CAD2021的序列号和密钥激活步骤如下:1.首先,确保您已经购买了CAD2021的许可证。您可以在Autodesk官网上购买或联系您的Autodesk代理购买。2.下载并安装CAD2021软件。...