Python 调试更好的方式

在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值