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 = 4
tail = 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 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() 函数,因为它是为调试目的而设计的。同时,它也不会取代日志系统。推荐大家在日常工作学习中多多使用!
10
总结
在本文中,我介绍了一个很棒的 Python 第三方库,名为"Ice Cream"。它增强了Python 的普通print() 函数,并提供了详细的输出。因此,它使调试变得非常方便。
Ice Cream库永远不会取代print() 函数,因为它是为调试目的而设计的。同时,它也不会取代日志系统。推荐大家在日常工作学习中多多使用!