停止使用 Print 去调试你的 Python 代码!

发布于 2021-04-08 10:23:32

停止使用 Print 去调试 Python 代码,请使用 Icecream 替代!

你是否使用 Print 或者 Log 去调试代码?使用 Icecream 来替代它们吧。

0_uTRIRERbf-Gg0UKN.jfif

原因

如果你使用 Print 去调试你的代码,你可能会感到困惑,通过查看终端上许多行的输出,然后试图找出每一行输出所属的代码行。

例如,运行下面的脚本

num1 = 30
num2 = 40 

print(num1)
print(num2)

你将得到下面的输出

30
40

它们中的哪个输出是 num1?哪个输出是 num2?两中输出可能不是那么难发现,但如果有超过 5 种不同的输出呢?试图找出相对应的源码可能会很长耗费时间。

你可以在 print 种添加文本使其更加容易理解:

num1 = 30
num2 = 40 

print('num1', num1)
print('num2', num2)

运行代码,得到以下的输出:

num1 30
num2 40

这个输出更容易阅读,但同样,写输出文本是很费时间的。是否有一种打印代码的方式,是负责输出而不需要添加额外的文本,就像下面这样:

num1 = 30
num2 = 40 

ic(num1)
ic(num2)

运行代码,得到以下的输出:

ic| num1: 30
ic| num2: 40

这时候 Icecream 就派上用场了。

什么是 Icecream?

Icecream 是一个 Python 库,它可以使用最少的代码使打印调试更具可读性。

安装 Icecream, 使用下面的方式:

pip install icecream

让我们打印一个 Python 函数的输出来尝试一下 Icecream。

from icecream import ic


def plus_five(num):
    return num + 5


ic(plus_five(4))
ic(plus_five(5))

运行代码,得到以下的输出:

image-20210408093123332.png

通过使用 Icecream,我们不仅仅看到了输出,而且还看到了函数和函数的参数!如此方便!终端的颜色也和上面的输出一样丰富多彩。

检查执行

为了定位代码执行的位置,你可以执行如下所示的操作来查找执行了哪条语句:

def hello(user:bool):
    if user:
        print("I'm user")
    else:
        print("I'm not user")


hello(user=True)

运行代码,得到以下的输出:

I'm user

Icecream 通过简单地运行 ic() 而不用附加文本,使你更容易执行上述操作;可以执行如下所示的操作来查找执行了哪条语句:

image-20210408094007794.png

运行代码,得到以下的输出:

image-20210408093832540.png

现在,你知道在函数 hello 的第 6 行的代码被执行了,第 8 行的代码没有被执行。

自定义前缀

如果你想在打印语句中插入一个自定义前缀,比如代码的执行时间, Icecream 也允许你这样做。

from datetime import datetime
from icecream import ic
import time


def time_format():
    return f'{datetime.now()}|> '


ic.configureOutput(prefix=time_format)


for _ in range(3):
    time.sleep(1)
    ic('Hello')

运行代码,得到以下的输出:

image-20210408094351800.png

现在,代码的执行时间将自动地显示在输出中,是不是很酷?

获取更多上下文

除了知道负责输出的代码之外,你可能还想知道代码是从哪行和哪个文件执行的。要想了解代码的上下文,请向 ic.configureOutput() 添加 includeContext=True:

from datetime import datetime
from icecream import ic
import time


def time_format():
    return f'{datetime.now()}|> '


ic.configureOutput(prefix=time_format, includeContext=True)


for _ in range(3):
    time.sleep(1)
    ic('Hello')

运行代码,得到以下的输出:

image-20210408094922782.png

现在,你知道第一行输出是由 ice_test.py 文件中的 Hello 函数在 15 代码执行的。

结论

恭喜你!你刚刚学习了如何使打印更具可读性通过使用 Icecream。对于我来说,Icecream 是一个很棒的调试工具,我也希望你能发现它很有用。

文章转自 Medium,如有侵权联系删除

1 条评论

发布
问题