不要再使用print在Python中调试了,Ice Cream 来了!
共 3972字,需浏览 8分钟
·
2021-06-25 20:15
Python 中最常用的函数是什么?可能在大多数编程语言中,它一定是 print() 函数。我相信大多数像我这样的开发人员会在开发过程中多次使用它将消息打印到控制台中。
当然,目前没有其他方法可以完全替代 print()函数。然而,当我们想要输出一些东西用于调试时,肯定有更好的方法。
在本文中,我将介绍一个非常有趣的 Python 第三方库,名为“Ice Cream”,它可以为快速简单的调试创造许多便利。有所收获,欢迎点赞支持一下!
一个糟糕例子
让我们从一个相对糟糕的例子开始。假设我们已经定义了一个函数,我们想看看它是否按预期工作。
def square_of(num):
return num*num
此函数仅返回作为参数传入的数字的平方。我们可能想测试多次如下:
print(square_of(2))
print(square_of(3))
print(square_of(4))
现在还可以。然而,在实践中我们将有更多的代码行。另外,可能有许多 print() 函数将不同的内容打印到输出区域。在这种情况下,有时我们可能会混淆哪个 print() 函数生成哪个输出。
因此,在 print() 函数的内容中添加一些简短的描述来提醒我们它是关于什么的,这是一种很好的方式。
print('square of 2:', square_of(2))
print('square of 3:', square_of(3))
print('square of 4:', square_of(4))
现在好多了,但是每次都这样太累了。另外,当我们完成开发时,很可能要删除大部分调试打印。
基本用法
让我们看看 Ice Cream 库,它是如何解决上述问题的?首先,我们需要使用pip从PyPI存储库安装它。
pip install icecream
然后,让我们按如下方式导入库
from icecream import ic
现在,我们可以将它作为调试信息打印出来。
调用函数
我们可以直接使用 icecream 来打印出来,就像我们以前使用print()函数所做的那样。
ic(square_of(2))
ic(square_of(3))
ic(square_of(4))
太棒了!我们从未在 ic() 函数中指定任何内容,但它会自动输出函数名和参数以及结果。因此,我们不必再手动添加"简要描述"。
查阅词典
不仅可以调用函数,Ice Cream 还可以输出便于调试的所有详细信息,例如访问字典的键值对。
my_dict = {
'name': 'Chris',
'age': 33
}
ic(my_dict['name'])
在本例中,我定义了一个字典,并尝试从它的键访问其中的值。Ice Cream 输出字典的变量名和我正在访问的键。
访问对象的属性
再举一个例子,让我们定义一个类并从中实例化一个对象。
class Dog():
num_legs = 4
tail = True
dog = Dog()
现在,让我们使用 Ice Cream 来输出它的属性。
ic(dog.tail)
在If条件下调试
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() 函数将始终告诉我们。
位置不影响结果
在我看来,Ice Cream 这个很酷的特点需要强调一下。我们可以将 ic()函数放在代码中的任何地方,而不会影响它。
让我们继续使用上一节中定义的 sqaure_of() 函数。
num = 2
square_of_num = square_of(ic(num))
在这个例子中,假设我们有一个变量num,我们想计算它的平方。我将 ic()函数放在变量num之外,而不是 num 的平方的外面,对此结果不会受到影响。
我们可以进行如下测试:
if ic(square_of_num) == pow(num, 2):
ic('Correct!')
禁用 Ice Cream
在使用 print() 函数进行调试时,最大的问题之一是它们太多了。当我们完成开发时,到处都有它们是很常见的。那么,如果我们想清理代码来删除它们,那将是一场灾难。
如果我们使用 Ice Cream 库进行调试,我们需要做的只是禁用它。
ic.disable()
之后,所有ic()函数都将停止输出任何内容。例如,下面的代码将不输出任何内容。
你可能会问,如果我们禁用了它,square_of_num 还会执行吗?别担心,禁用功能只会禁用输出,我们不需要担心任何其他功能。
if ic(square_of_num) == pow(num, 2):
print('Correct!')
如果我们将输出改回 print() 函数,它仍然可以输出。这意味着 ic(square_of_num) 仍然等价于 square_of_num。当然,如果我们想回到调试模式,Ice Cream 可以重新启用。
ic.enable()
定制 Ice Cream 输出
Ice Cream 定制输出。最常用的定制是更改前缀。您可能已经注意到,默认输出总是带有前缀ic |。是的,我们可以定制。
例如,我们可以将其更改为Debug |,这对其调试目的更有意义。
ic.configureOutput(prefix='Debug | ')
ic('test')
实际上,前缀也可以设置为函数,而不是静态字符串。例如,让我们定义一个函数,以格式化字符串的形式返回当前时间戳。
from datetime import datetime
def now():
return f'[{datetime.now()}] '
然后,我们可以将该函数设置为 Ice Cream 前缀。
ic.configureOutput(prefix=now)
ic('test')
总结
在本文中,我介绍了一个非常棒的 Python 第三方库,名为“Ice Cream”。它用详细的输出增强 Python 的 print() 函数,Ice Cream 的好玩用法还有很多,有兴趣的小伙伴可以去实践一下吧!
大家好,最后给大家免费分享 Python 三件套:《ThinkPython》、《简明Python教程》、《Python进阶》的PDF电子版。如果你是刚入门的小白,不用想了,这是最好的学习教材。
现在免费分享出来,有需要的读者可以下载学习,在下面的公众号里回复关键字:三件套,就行。
领取方式:
长按下方扫码,关注后发消息 [三件套]
感谢你的分享,点赞,在看三连