1. 引言
Python 中最常用的函数是什么?像在大多数编程语言中,print()
函数是最常用的。我相信大多数开发者都会像我一样,在开发过程中多次使用它将信息进行打印。
当然,没有其他方法可以完全取代print()
函数。不过,当我们想输出一些东西用于调试时,肯定有更好的方法。在本文中,我将介绍 Python 中一个非常有趣的第三方库,名为 "Ice Cream"
。它可以为快速、简单的调试提供很多便利。
2. 举个栗子
让我们从一个相对糟糕的例子开始。假设我们定义了一个函数,并想看看它是否按预期运行。
def square_of(num):return num*num
该函数只是返回作为传递参数的数字的平方。我们可能需要对它进行多次测试,如下所示。
现在这样做还可以。但是,在实际应用中,我们的代码行数会更多。此外,可能会有许多 print()
函数向输出区域打印不同的内容。在这种情况下,有时我们可能会搞不清哪个输出是由哪个 print()
函数生成的。
因此,在 print() 函数的内容中添加一些简要说明,以提醒我们它的用途,不失为一种好方法。
现在好多了,但每次都这样做太累了。另外,当我们完成开发后,很可能要删除大部分调试打印。
3. 安装
让我们来看看 Ice Cream
库。它是如何解决上述问题的?首先,我们需要使用 pip
从 PyPI
仓库安装。
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
函数放在 if
和else
块中,看看会发生什么。
虽然 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()
函数,因为它是为调试目的而设计的。同时,它也不会取代日志系统。推荐大家在日常工作学习中多多使用!