当前位置: 首页 > news >正文

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)

效果如下:

在这里插入图片描述

可以看到,它将每一行变量的值都输出到屏幕上,方便你调试代码。

仅仅需要写一行代码—使用装饰器就可以实现这个方便的调试功能,比起一行行写print,这可方便多了。

1.准备

请选择以下任一种方式输入命令安装依赖
1. Windows 环境 打开 Cmd (开始-运行-CMD)。
2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.

pip install pysnooper

除了文章开头提到的基本使用方法,这个模块还有其他好用的功能。

2.功能

基本使用方法,在你的函数上加一个 pysnooper 装饰器:

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)

效果如下:

在这里插入图片描述

2.1 支持日志文件

如果你觉得print到屏幕上不方便,还可以将其输出到log文件中,你只需要将装饰器那一行改为:

@pysnooper.snoop('/my/log/file.log')

2.2 读取局外变量或其他表达式

如果你想读取在装饰器作用范围以外的变量或者表达式的值,还可以使用watch参数:

@pysnooper.snoop(watch=('foo.bar', 'self.x["whatever"]'))

2.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()

效果如下,只有上下文里的代码才会被调试出来:

在这里插入图片描述

当我们只需要调试部分代码的时候,这个上下文形式的调试方法非常方便。

此外,PySnooper还有许多更强大的用法,大家可以看他们的高级使用文档:

https://github.com/cool-RR/PySnooper/blob/master/ADVANCED_USAGE.md

我们的文章到此就结束啦,原创不易,如果你喜欢今天的Python 实战教程,希望你能在下面点个赞和在看支持我继续创作,谢谢!

相关文章:

  • 【PTA】输出学生成绩
  • 数据结构栈的使用——马踏棋盘
  • 网络知识之跨区域网络的通信
  • C#三层架构
  • 动态内存开辟(上)
  • 【云原生】阿里云容器镜像服务产品ACR EE之国内外场景应用模拟
  • html之网页结构
  • 手把手教你使用LabVIEW人工智能视觉工具包快速实现传统Opencv算子的调用(含源码)
  • Python小知识点
  • 目标检测 YOLOv5 - 最新版本v6.2模型在瑞芯微 Rockchip设备上运行的方案
  • Android 项目必备(三十)-->从 0 到 1 开发一个属于自己的 App
  • led灯珠型号及使用参数
  • MYSQL介绍——数据库的增删改及常用函数
  • 线性单功能PEG试剂甲氧基-聚乙二醇-丙烯酰胺,mPEG-Acrylamide,mPEG-ACA
  • 洛谷P3694
  • 网络传输文件的问题
  • 《Java编程思想》读书笔记-对象导论
  • canvas 高仿 Apple Watch 表盘
  • create-react-app做的留言板
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • mysql_config not found
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue-loader 源码解析系列之 selector
  • webpack+react项目初体验——记录我的webpack环境配置
  • 前端自动化解决方案
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 源码安装memcached和php memcache扩展
  • 最简单的无缝轮播
  • ​水经微图Web1.5.0版即将上线
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (过滤器)Filter和(监听器)listener
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)u-boot-nand.bin的下载
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [100天算法】-实现 strStr()(day 52)
  • [2669]2-2 Time类的定义
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [Asp.net mvc]国际化
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [BJDCTF 2020]easy_md5
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [cocos2d-x]关于CC_CALLBACK
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
  • [Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷
  • [ffmpeg] 定制滤波器
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [Grafana]ES数据源Alert告警发送
  • [Linux] Apache的配置与运用
  • [Linux] Boot分区满了的处理方法 The volume boot has only 0 bytes disk space remaining