【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 = 4tail = 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 somethingic()else:# do something elseic()
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.mzph.cn/news/798265.shtml

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

相关文章

c++算法学习笔记 (20) 哈希表

1.模拟散列表 // 拉链法 #include <bits/stdc.h> using namespace std; const int N 100003; int h[N]; int e[N], ne[N], idx; // 存链void insert(int x) {int k (x % N N) % N; // 让负数的余数变成正数(若直接加N,则可能溢出)e[idx] x;ne[idx] h[k];h[k] idx;…

传动设计选型

一. 齿轮选型 1齿轮传动概述 齿轮传动首先自然是一对对的&#xff0c;故也叫齿轮副。原理其实大家基本都知道&#xff0c;很多玩具中都会有齿轮传动的身影&#xff0c;比如小时候玩的四驱车。就是两齿轮互相啮合互相推动&#xff0c;然后输出旋转动力或者改变传递动力的方向&…

基于SpringBoot Vue学生信息管理

一、&#x1f4dd;功能介绍 基于SpringBoot Vue学生信息管理 角色&#xff1a;管理员、学生、教师 管理员&#xff1a;管理员进入主页面&#xff0c;主要功能包括对系统首页、个人中心、学生管理、教师管理、公告通知管理、课程类型管理、课程信息管理、选课信息管理、课程成…

使用STM32实现 蓝牙插座

硬件介绍 蓝牙模块HC-01 蓝牙模块&#xff0c;又叫做蓝牙串口模块 串口透传技术&#xff1a;透传即透明传送&#xff0c;是指在数据的传输过程中&#xff0c;通过无线的方式这组数据不发生任何形式的改变&#xff0c;仿佛传输过程是透明的一样&#xff0c;同时保证传输的质量&…

农业地物反演采用卫星影像技术方法

一、引言 随着空间技术的快速发展&#xff0c;卫星影像已经成为一种重要的工具&#xff0c;用于提供全球尺度的数据收集和分析。在农业领域&#xff0c;卫星影像被广泛应用于植物反演&#xff0c;以获取关于作物生长和健康的实时信息。本文旨在全面概述卫星影像在农业植物反演中…

baseline SE SP YI是什么?

SE、SP和YI是评估分类模型性能时常用的几个统计指标&#xff0c;特别是在医学影像处理、疾病诊断等领域&#xff0c;这些指标帮助了解模型对于正负类样本的识别能力。 SE (Sensitivity)&#xff0c;也称为真正率&#xff08;True Positive Rate, TPR&#xff09;或召回率&#…

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

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

hive词频统计---文件始终上传不来

目录 准备工作&#xff1a; 文件内容&#xff1a; 创建数据库及表 将文件上传到&#xff1a;上传到/user/hive/warehouse/db1.db/t_word目录下 hive里面查询&#xff0c;始终报错&#xff1a;&#xff08;直接查询也是不行&#xff09; 解决方案&#xff1a; 准备工作&am…

OPC UA遇见chatGPT

最近opc 基金会将召开一个会议&#xff0c;主题是”OPC UA meets IT“。由此可见&#xff0c;工业自动化行业也开始研究和评估chatGPT带来的影响了。 本文谈谈本人对OPC UA 与chatGPT结合的初步实验和思考。 构建OPC UA 信息模型 chatGPT 的确非常强大了&#xff0c;使用自然…

Stable Diffusion文生图技术详解:从零基础到掌握CLIP模型、Unet训练和采样器迭代

文章目录 概要Stable Diffusion 底层结构与原理文本编码器&#xff08;Text Encoder&#xff09;图片生成器&#xff08;Image Generator&#xff09; 那扩散过程发生了什么&#xff1f;stable diffusion 总体架构主要模块分析Unet 网络采样器迭代CLIP 模型 小结 概要 Stable …

C++设计模式:装饰器模式(四)

1、定义与动机 装饰器模式定义&#xff1a;动态&#xff08;组合&#xff09;地给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类&#xff08;继承&#xff09;更为灵活&#xff08;消除重复代码 & 减少子类个数&#xff09;。 在某些情…

如何理解CDN?说说实现原理?

文章目录 一、是什么二、原理分析负载均衡系统缓存代理 三、总结参考文献 一、是什么 CDN (全称 Content Delivery Network)&#xff0c;即内容分发网络 构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内…

成为一个ATE工程师是什么体验?

当你成为ATE工程师&#xff0c;是什么感受&#xff1f; 按照业内资深工程师的玩笑话来说&#xff1a;整的是比劳斯莱斯还贵的设备&#xff0c;更高端的机台顶得起上海几套房。 1、什么是ATE测试&#xff1f; 一颗芯片的生命周期始于市场需求&#xff0c;从产品的定义与设计&…

蓝桥杯-dfs搜索模板题(一)

蓝桥杯-dfs搜索模板题&#xff08;一&#xff09; P2089 烤鸡P1088 火星人P1149 火柴棒等式P2036 PERKETP1135 奇怪的电梯结语 P2089 烤鸡 对于每个位置枚举数字 #include<bits/stdc.h>using namespace std;const int N1010;int n;int arr[N];//临时方案 int res0;//方案…

163 Linux C++ 通讯架构实战17,本地套接字整理对比,IPC:pipe,fifo,mmap,信号,本地套

IPC&#xff1a; Linux环境下&#xff0c;进程地址空间相互独立&#xff0c;每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程和进程之间不能相互访问&#xff0c;要交换数据必须通过内核&#xff0c;在内核中开辟一块缓冲…

并发编程三大特性之可见性

一、什么是可见性&#xff1f; 可见性问题是基于CPU位置出现的&#xff0c;cpu处里速度非常快&#xff0c;相对CPU来说去主内存 获取数据这个事情太慢了&#xff0c;CPU就提供了 L1&#xff0c;L2&#xff0c;L3的三季缓存&#xff0c;每次去主内存拿完 数据后&#xff0c;数据…

使用LIKE进行模糊查询

查询包含字符‘e’的信息 % 代表不确定个数的字符&#xff08;零个或多个&#xff09; SELECT employee_id, first_name FROM employees WHERE first_name LIKE %e%; 查询以字符‘e’开头的字符 SELECT employee_id, first_name FROM employees WHERE first_name LIKE e%; _…

腾讯云2024年优惠券领取及使用常见问题

腾讯云作为国内领先的云计算服务提供商&#xff0c;经常会推出各种优惠活动&#xff0c;以此来吸引用户上云。其中&#xff0c;优惠券作为一种常见的促销方式&#xff0c;受到了众多用户的青睐。然而&#xff0c;在领取和使用优惠券的过程中&#xff0c;大家可能会遇到一些常见…

1.《C语言》—— [常见概念]

前言: C语言是学习编程的一门语言&#xff0c;C语言概念少&#xff0c;词汇少&#xff0c;包含了基本的编程元素&#xff0c;再后来的很多语言如&#xff08;C&#xff0c;Java&#xff09;等都参考了C语言&#xff0c;所以想要学好编程&#xff0c;C语言是必不可少的一门&…

77、WAF攻防——权限控制代码免杀异或运算变量覆盖混淆加密传参

文章目录 WAF规则webshell免杀变异 WAF规则 函数匹配 工具指纹 webshell免杀变异 php 传参带入 eval可以用assert来替换,assert也可以将字符串当作php代码执行漏洞 php 变量覆盖 php 加密 使用加密算法对php后门进行加密 php 异或运算 简化:无字符webshellP 无数字字母rc…