【Python】还在用print进行调试,你Out了!!!

news2024/11/15 21:53:11

1. 引言

Python 中最常用的函数是什么?像在大多数编程语言中,print() 函数是最常用的。我相信大多数开发者都会像我一样,在开发过程中多次使用它将信息进行打印。

当然,没有其他方法可以完全取代print()函数。不过,当我们想输出一些东西用于调试时,肯定有更好的方法。在本文中,我将介绍 Python 中一个非常有趣的第三方库,名为 "Ice Cream"。它可以为快速、简单的调试提供很多便利。

2. 举个栗子

让我们从一个相对糟糕的例子开始。假设我们定义了一个函数,并想看看它是否按预期运行。

def square_of(num):
    return num*num

该函数只是返回作为传递参数的数字的平方。我们可能需要对它进行多次测试,如下所示。
在这里插入图片描述
现在这样做还可以。但是,在实际应用中,我们的代码行数会更多。此外,可能会有许多 print() 函数向输出区域打印不同的内容。在这种情况下,有时我们可能会搞不清哪个输出是由哪个 print() 函数生成的。

因此,在 print() 函数的内容中添加一些简要说明,以提醒我们它的用途,不失为一种好方法。
在这里插入图片描述
现在好多了,但每次都这样做太累了。另外,当我们完成开发后,很可能要删除大部分调试打印。

3. 安装

让我们来看看 Ice Cream 库。它是如何解决上述问题的?首先,我们需要使用 pipPyPI 仓库安装。

pip install icecream

然后,让我们按如下方式导入上述第三方库。

from icecream import ic

现在,我们可以用它来打印我们需要的调试信息。

4. 函数调用

我们可以直接使用 Ice Cream 来打印函数,就像之前使用 print() 函数一样。

ic(square_of(2))
ic(square_of(3))
ic(square_of(4))

输出结果如下:
在这里插入图片描述
好极了!我们从未在 ic() 函数中指定任何内容,但它会自动输出函数名称和参数以及结果。因此,我们不必再手动添加 "相关说明 "了。

5. 访问字典

不仅调用函数,Ice Cream 还可以输出一切便于调试的冗余信息,例如访问字典的键值对。


my_dict = {
    'name': 'Chris',
    'age': 33
}
ic(my_dict['name'])

输出如下:
在这里插入图片描述
在本例中,我定义了一个字典,并尝试通过键值访问其中的一个值。Ice Cream 会输出字典的变量名和我要访问的键值。

6. 访问对象属性

再举一个例子,让我们定义一个类并从中实例化一个对象。

class Dog():
    num_legs = 4
    tail = True
dog = Dog()
ic(dog.tail)

输出如下:
在这里插入图片描述

7. 在条件语句中使用

Ice Cream 库不仅可以用于检查变量,还可以用于条件控制语句,如if条件。例如,让我们编写一个简单的if-else条件如下:

input = 'Chris'
if input == 'Chris':
    ic()
else:
    ic()

我们只需将Ice Cream函数放在 ifelse块中,看看会发生什么。
在这里插入图片描述
虽然 if-else 语句目前没有任何作用,但 ic() 函数仍会告诉我们它在何时何地被调用,以及行号。顺便说一下,上述这个演示中使用的是 Python Notebooks。如果在".py "文件中运行,它还可以告诉我们调用的文件名。

我们来看一个更实用的用法,如下:

def check_user(username):
    if username == 'Chris':
        # do something
        ic()
    else:
        # do something else
        ic()
check_user('Chris')
check_user('Jade')

该函数将对不同的用户执行不同的操作。出于调试目的,我们总是想知道哪个用户是当前用户。那么,ic() 函数总是会告诉我们这一点。
在这里插入图片描述

8. 插入现有代码

在我看来,这是Ice Cream 库需要特别强调的功能。也就是说,ic()函数不仅可以输出冗长信息,还可以将值传递过去,这样它就可以封装任何内容。换句话说,我们可以在代码中的任何地方使用 ic() 函数,而不会对其产生影响。我们来看个例子:

num = 2
square_of_num = square_of(ic(num))

运行如下:
在这里插入图片描述
在本例中,假设我们有一个变量 num,并想计算它的平方。我没有使用 square_of(num),而是将变量num先传递给ic函数。因此,变量 num 的值会被打印出来,然后赋值给 square_of_num, 最终的结果不会受到影响。

我们可以对结果进行如下测试。

if ic(square_of_num) == pow(num, 2):
    ic('Correct!')

结果如下:
在这里插入图片描述
因此,square_of_num 等于变量num的平方。另外,在这个if条件中,我还使用了ic()函数,但不影响目的,只是打印了变量 square_of_num 以供调试!

9. 功能禁用

在使用 print() 函数进行调试时,最大的问题之一就是它们太多了。当我们完成开发时,到处都是这些代码,这是非常常见的。如果我们想清理代码以删除它们,那将是非常麻烦的。如果我们使用Ice Cream库进行调试,只需禁用它即可。

ic.disable()

之后,所有 ic() 函数都将停止输出任何内容。例如,下面的代码将不会输出任何内容。

ic.disable()
if ic(square_of_num) == pow(num, 2):
    print('Correct!')

你可能会问,变量 square_of_num 怎么样?如果我们禁用了 Ice Cream 函数,它还会正常工作嘛?别担心,禁用功能只会禁用输出,我们不需要担心任何其他功能。
在这里插入图片描述

当然,如果我们想回到调试模式,可以重新启用 Ice Cream

ic.enable()

10. 总结

在本文中,我介绍了一个很棒的 Python 第三方库,名为 "Ice Cream"。它增强了 Python 的普通 print() 函数,并提供了详细的输出。因此,它使调试变得非常方便。

Ice Cream 库永远不会取代 print() 函数,因为它是为调试目的而设计的。同时,它也不会取代日志系统。推荐大家在日常工作学习中多多使用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1575261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鱼塘钓鱼(c++实现)

题目 有 N 个鱼塘排成一排,每个鱼塘中有一定数量的鱼,例如:N5 时,如下表: 即:在第 1 个鱼塘中钓鱼第 1 分钟内可钓到 10 条鱼,第 2 分钟内只能钓到 8 条鱼,……,第 5 分…

【JavaEE】_Spring MVC项目获取Cookie

目录 1. Cookie与Session基础知识 1.1 Cookie与Session的区别 2. 使用servlet原生方法获取Cookie 2.2 关于λ表达式遍历法的空指针问题 2.3 Cookie的伪造 3. 使用Spring注解获取Cookie 3.1 获取单个Cookie 3.2 获取多个Cookie 1. Cookie与Session基础知识 在本专栏HTT…

【随笔】Git 高级篇 -- 整理提交记录(上)cherry-pick(十五)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

docker-compose安装adguard给局域网提供dns加速服务

启动配置 docker-compose.yaml配置文件 version: 3.3 services:adguard:image: adguard/adguardhome:latestcontainer_name: adguardrestart: unless-stoppedvolumes:- ./workdir:/opt/adguardhome/work- ./confdir:/opt/adguardhome/confports:- 53:53/tcp- 53:53/udp- 81:8…

【fdisk 相关分区命令记录】

目的 记录下新磁盘下刚刚分配的系统(安装系统后未操作或者新扩容的)的分区格式化及挂载,比如这里运维分配了100G 步骤: 1.查看新硬盘 lsblk -f查看,sdb就是新分配的硬盘,无任何相关的属性信息 2、分区明细查看 fd…

鸿蒙内核源码分析 (双向链表篇) | 谁是内核最重要结构体

双向链表是什么&#xff1f; 谁是鸿蒙内核最重要的结构体 &#xff1f; 一定是: LOS_DL_LIST(双向链表)&#xff0c; 它长这样。 typedef struct LOS_DL_LIST {struct LOS_DL_LIST *pstPrev; /**< Current nodes pointer to the previous node | 前驱节点(左手)*/struct L…

ZYNQ学习Linux 基础外设的使用

基本都是摘抄正点原子的文章&#xff1a;《领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf》&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 工程的创建参考&#xff1a;《ZYNQ学习之Petalinux 设计流程实战》 一、GPIO 之 LED 的使…

Open CASCADE学习|旋转变换

物体在三维空间中的旋转变换操作通常可以通过三种不同的方式来表示&#xff1a;矩阵&#xff08;Matrix&#xff09;、欧拉角&#xff08;Euler Angles&#xff09;和四元数&#xff08;Quaternion&#xff09;。下面详细解释这三种表示方法。 矩阵&#xff08;Matrix&#xf…

SpringCloud学习(10)-SpringCloudAlibaba-Nacos服务注册、配置中心

Spring Cloud Alibaba 参考文档 Spring Cloud Alibaba 参考文档 nacos下载Nacos 快速开始 直接进入bin包 运行cmd命令&#xff1a;startup.cmd -m standalone 运行成功后通过http://localhost:8848/nacos进入nacos可视化页面&#xff0c;账号密码默认都是nacos Nacos服务注…

全景化工厂虚拟场景VR在线编辑突破传统束缚

数字化时代来临&#xff0c;让很多行业发生了天翻地覆的变化&#xff0c;更多人和企业接纳和亲近VR/AI/3D等技术&#xff0c;虚拟仿真VR内容编辑器系统不仅在畜牧培训领域大放异彩&#xff0c;更在其他多个行业领域展现出广泛的应用前景。 相比传统的VR虚拟现实应用程序开发依赖…

如何使用开源情报跟踪一个人?在线访问网站以及使用方法介绍

如何使用开源情报跟踪一个人&#xff1f;在线访问网站以及使用方法介绍。 开源情报&#xff08;OSINT&#xff09;是一门关于收集和分析公开可用信息的独特技艺&#xff0c;它致力于构建个人或团体的详尽档案。 这一过程中&#xff0c;信息搜集者会利用多元化的信息源&#xff…

如何使用 langchain 与 openAI 连接

上一篇写了如何安装 langchain https://www.cnblogs.com/hailexuexi/p/18087602 这里主要说一个 langchain的使用 创建一个目录 langchain &#xff0c;在这个目录下创建两个文件 main.py 这段python代码&#xff0c;用到了openAI&#xff0c;需要openAI及FQ。这里只做…

【NLP】隐马尔可夫(HMM)与条件随机场(CRF)简介

一. HMM 隐马尔可夫模型&#xff08;Hidden Markov Model, HMM&#xff09;是一种用于处理含有隐藏状态的序列数据的统计学习模型。通过建模隐藏状态之间的转移关系以及隐藏状态与观测数据的生成关系&#xff0c;HMM能够在仅观察到部分信息的情况下进行状态推理、概率计算、序…

Spring Security——06,授权_封装权限信息

授权_封装权限信息 一、权限系统的作用二、授权基本流程三、限制访问资源所需权限四、封装权限信息4.1 权限信息封装到LoginUser4.2 LoginUser 添加权限4.3 过滤器封装权限信息 五、断点测试5.1 有权限的访问5.2 没有权限的访问 一键三连有没有捏~~ 一、权限系统的作用 例如一…

数据结构(3)----栈和队列

目录 一.栈 1.栈的基本概念 2.栈的基本操作 3.顺序栈的实现 •顺序栈的定义 •顺序栈的初始化 •进栈操作 •出栈操作 •读栈顶元素操作 •若使用另一种方式: 4.链栈的实现 •链栈的进栈操作 •链栈的出栈操作 •读栈顶元素 二.队列 1.队列的基本概念 2.队列的基…

物联网实战--驱动篇之(三)LoRa(sx1278)

目录 一、LoRa简介 二、sx1278模块 三、硬件抽象层 四、SX1278初始化 五、发送时间计算 六、发送模式 七、接收模式 八、总结 一、LoRa简介 LoRa在物联网传输领域有着举足轻重的地位&#xff0c;平时大家可能比较少听说&#xff0c;因为它主要还是在行业应用&#xff0…

精心整理-数据分类分级赋能企业数据安全建设资料合集

以下是资料目录&#xff0c;如需下载请前往知识星球下载&#xff1a;https://t.zsxq.com/18KTZnJMX 企业数据安全建设数据分类分级架构.pdf 企业数据分类分级模板.xls 数据分类分级的实践与挑战.pdf 数据分类分级制度评述.pdf 电信和互联网大数据安全管控分类分级实施指南.pdf …

嵌入式学习49-单片机2

指令周期 1M 机器周期 12M &#xff08;晶体震荡器产生&#xff09; 中断两种方式 …

STL--list和vector有什么区别

list 和 vector 是 C STL 中的两种常见容器&#xff0c;它们在底层实现、性能特性和适用场景方面有着显著的区别&#xff1a; 底层数据结构&#xff1a; vector 底层是一个动态数组&#xff0c;提供快速的随机访问&#xff0c;但在中间插入或删除元素效率较低。 list 是一个双…

鸿蒙ArkUI实例:【自定义组件】

组件是 OpenHarmony 页面最小显示单元&#xff0c;一个页面可由多个组件组合而成&#xff0c;也可只由一个组件组合而成&#xff0c;这些组件可以是ArkUI开发框架自带系统组件&#xff0c;比如 Text 、 Button 等&#xff0c;也可以是自定义组件&#xff0c;本节笔者简单介绍一…