尽管有那么多花里胡哨的debug工具和方式供我们选择,但不得不承认,在大多数情况下,print()才是最方便的代码调试方式
通过手动在程序中的关键位置书写合适的打印语句,可以很快速地帮助我们了解到程序运行的过程,发现问题所在。
而icecream就是一个将print大法发挥到极致的Python库,它的工作方式有些像vscode中针对javascript的插件Turbo Console Log
使用print来调试代码,你会发现查看终端上的许多行输出,然后试图找出每个输出属于哪些代码,这是一个非常繁琐的过程。
下面就让我们一起来领略icecream中的实用功能吧🍦~
def add(a, b): return a + b print(add(10, 8)) print(add(221, 91)) print(add(110, 78)) print(add(28, 14)) print(add(159, 76)) print(add(65, 4631)) ''' 18 312 188 42 235 4696 '''
这些输出中哪一个是 159+76?这些输出中哪一个是 221 + 91?
如果数据很少可能还不是那么糟糕,但是如果有超过5个不同的输出呢?
试图找到负责输出的源代码可能会非常耗时。
当然,可以尝试在print语句中添加文本来进行标记,以便更容易地理解:
def add(a, b): print(f'{a}'+'+'+f'{b}:') return a + b print(add(10, 8)) print(add(221, 91)) print(add(110, 78)) print(add(28, 14)) print(add(159, 76)) ''' 10+8: 18 221+91: 312 110+78: 188 28+14: 42 159+76: 235 65+4631: 4696 '''
但同样,输出文本也会非常耗时。是否有一种方法可以打印负责输出的代码,而不需要输出额外的文本呢?
这就是冰淇淋派上用场的时候了!
什么是冰淇淋?
Icecream是一个Python库,可通过最少的代码使打印调试更具可读性。
使用下面的代码安装冰淇淋
pip install icecream
然后,让我们按如下方式导入库
from icecream import ic
访问函数
依旧使用上述的加法函数作为测试
from icecream import ic def add(a, b): return a + b ic(add(10, 8)) ic(add(221, 91)) ic(add(110, 78)) ic(add(28, 14)) ic(add(159, 76)) ic(add(65, 4631)) ''' ic| add(10, 8): 18 ic| add(221, 91): 312 ic| add(110, 78): 188 ic| add(28, 14): 42 ic| add(159, 76): 235 ic| add(65, 4631): 4696 '''
我们从未在 ic() 函数中指定任何内容,但它会自动输出函数名和参数以及结果。因此,我们不必再手动添加"简要描述"。
使用ic的好处,我们不仅可以看到输出,还可以看到函数及其参数!多么方便!
访问字典
我定义了一个字典,并尝试从它的键访问其中的值。Ice Cream 输出字典的变量名和我正在访问的键。
from icecream import ic my_dict = { '姓名': '张三', '性别': '男', '年龄': '20' } print(my_dict['年龄']) ic(my_dict['年龄']) ''' 20 ic| my_dict['年龄']: '20' '''
访问对象
from icecream import ic class singer(): lin = '江南' xu = '浅唱' LOL = True sin = singer() print(sin.lin) print(sin.xu) print(sin.LOL) ic(sin.lin) ic(sin.xu) ic(sin.LOL) ''' 江南 浅唱 True ic| sin.lin: '江南' ic| sin.xu: '浅唱' ic| sin.LOL: True '''
精准定位
我们可以通过ic() 精确的输出业务代码的位置。
尽管if else语句目前什么也不做,但ic()函数仍然告诉我们调用它的位置和时间,以及行号。
from icecream import ic def location(age): if 0 < age <= 18 : # bulabulabula...... ic() elif 18 < age <= 60: # bulabulabula...... ic() else: # bulabulabula...... ic() if __name__ == '__main__': location(10) location(56) location(88) ''' ic| test.py:5 in location() at 17:42:28.523 ic| test.py:8 in location() at 17:42:28.525 ic| test.py:11 in location() at 17:42:28.527 '''
冰淇淋的默认输出格式是,主要参数如下:
包括前缀:ic
文件名:test.py
代码位置:5, 8, 11行
函数:location()
ic| test.py:5 in location() at 17:42:28.523 ic| test.py:8 in location() at 17:42:28.525 ic| test.py:11 in location() at 17:42:28.527
自定义输出
from icecream import ic ic.configureOutput('kobe的四则运算:') ic(8+8) ic(18-8) ''' kobe的四则运算:8+8: 16 kobe的四则运算:18-8: 10 '''
输出时间
有时候,进行代码输出调试的时候
需要知道代码运行该位置时的精确时间
我们可以自定义icecream来实现带时间的输出
from icecream import ic from datetime import datetime # 将当前时间配置进ic里 ic.configureOutput(prefix=str(datetime.now())+'|') ic(8+8) ic(18-8) ''' 2021-07-26 18:37:46.601529|8+8: 16 2021-07-26 18:37:46.601529|18-8: 10 '''
好啦,今天的分享就到此结束啦~