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

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() 函数,因为它是为调试目的而设计的。同时,它也不会取代日志系统。推荐大家在日常工作学习中多多使用!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QA测试开发工程师面试题满分问答9: Python中内存管理的概念、原理、使用

概念原理 Python中的内存管理是由解释器自动处理的,它使用引用计数和垃圾回收机制来管理内存。以下是Python内存管理的一些关键概念、设计原理和最佳实践,以帮助您高效使用和管理内存: 引用计数:Python使用引用计数来追踪对象的引…

谷歌浏览器如何截全屏图片?

有时候想要截取浏览器全屏,谷歌浏览器自带截取全屏命令,操作步骤如下: 1、按住键盘的F12或者是空白处点击鼠标右键找到检查项 2、按住ctrlshiftp,会出现搜索框的界面 3、搜索框中输入screen,选中Capture full size scr…

项目架构MVC,DDD学习

写在前面 本文一起看下项目架构DDD,MVC相关的内容。 1:MVC 不管我们做什么项目,自己想想其实只是做了三件事,如下: 其实,这三件事完全在一个类中做完也可以可以正常把项目完成的,就像下面这…

Redis简介、常用命令

目录 一、关系数据库​​与非关系数据库​​ 1.1. 关系型数据库 1.2 非关系型数据库 1.3.关系数据库与非关系型数据库区别 1.3.1. 数据存储方式不同 1.3.2. 扩展方式不同 1.3.3.对事务性的支持不同 1.4.非关系型数据库产生背景 二、Redis 2.1.Redis简介 2.2.Redis的…

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

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

火山方舟大模型服务平台调用Demo测试(豆包)

豆包得后台大模型支持为字节得火山方舟,所以想使用豆包的API,直接从这里就可以。 一、首先注册账号: 火山引擎-云上增长新动力 注册完成之后,控制台-账户-API访问密钥 二、找到API测试用例: Skylark-chat API调用…

Linux实验3 shell命令进阶

一:实验目的 学习Linux下的文件系统结构,了解最基本的Linux下的shell命令操作,例如ls, cd, cat等各种指令操作。 学习vim编辑器的使用方式,学习如何使用ssh连接远程服务器。 二:实验内容 1.利用ls命令查找…

记一次Debug与Release版程序输出不一致的问题解决

问题叙述: 在x86平台下无论Debug还是Release都没问题,而在arm平台下Debug版本程序无问题,Release版本程序(-O3编译)发现输出值不正确,怀疑值被篡改,于是在调用前后分别使用printf打印出参数值&…

pdf操作器(图片转文字、PDF转word、PDF拆分、图片jpg、png互转)

pdf操作器(不用联网图片转文字、PDF转word、PDF拆分、图片jpg、png互转)介绍目前该软件实现了以下功能 pdf转wordpdf拆分图片,图片导出在桌面的一个文件夹里图片合并为pdf压缩、转换图片格式(jpg和png)OCR图片转文字&…

Leetcode刷题-哈希表详细总结(Java)

哈希表 当我们想使⽤哈希法来解决问题的时候,我们⼀般会选择如下三种数据结构。 数组set (集合)map(映射) 当我们遇到了要快速判断⼀个元素是否出现集合⾥的时候,就要考虑哈希法。如果在做⾯试题⽬的时候…

【Frida】【Android】 10_爬虫之WebSocket协议分析

🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

鸿蒙HarmonyOS 与 Android 的NDK有什么不一样?

1. 序言 就像开发Android要用Android Studio一样,Android Studio(简称AS)其实是基于IDEAgradle插件android插件开发而来。 鸿蒙系统,你可以认为它和android有点像,但又是超越android的存在,除了手机&…

IO流

一、IO概述 1.什么是IO流? 存储和读取数据的解决方案l: inputo: output流∶像水流一样传输数据 2.IO流的作用? 用于读写数据(本地文件,网络) 3.IO流按照流向可以分类哪两种流? 输出流:程序 - > 文件 输入流:文件 - > 程…

30道python自动化测试面试题与答案汇总!

Python是不可或缺的语言,它的优美与简洁令人无法自拔,下面这篇文章主要给大家介绍了关于30道python自动化测试面试题与答案汇总的相关资料,需要的朋友可以参考下 1、什么项目适合做自动化测试? 关键字:不变的、重复的、规范的 1)任务测试明…

Collection与数据结构 Stack与Queue(二):队列与Queue

1. 队列 1.1 概念 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作…

JVM内存性能调优思路之:通过GC log、Thread Dump 、Heap Dump分析内存使用说明

文章目录 一. 各日志概述1. Garbage Collection Log - 找到GC规律2. 线程转储(Thread dump) - 分析(快照)线程状态3. 堆转储(Heap dump) - APP某刻内存使用全貌 二. 命令1. 程序的gc日志2. 线程转储3. 堆转储 概述 在 Java 虚拟机中,(GC) Gar…

C语言分支语句

一、什么是语句 C语句可分为以下五类: 表达式语句 函数调用语句 控制语句 复合语句 空语句 本周后面介绍的是控制语句。 控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语 言有…

测试工程师求职是选自研公司还是选外包公司呢?

大家好, 今天我们一起来聊一聊测试工程师求职是选自研公司&还是选外包公司呢? 今天来谈谈我的个人看法,作为一个在测试岗位上多年的我来说,自研公司比较好,外包公司其实也不会差。各自都有特点特色,根据…

虚拟主机VPS和共享服务器有什么区别?VPS和共享服务器怎么选择,VPS和云服务器区别

今天易极赞小编来跟大家科普一个新的知识“虚拟主机和云服务器有什么区别?”看完这篇文章后你应该就能知道虚拟主机和云服务器哪个更适合你了。 如果你不知道服务器的常见类型有哪些,查看下面这篇文章: 服务器7中常见的类型,服务…

刷力扣中学习使用static,final

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/throne-inheritance/今天在力扣题中第一次使用了static和final&#xf…