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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值