IceCream — 不再使用 print()进行调试
IceCream
就像print
,但提供了更甜蜜的输出。你可以直接用ic
替代原来的print
。
相较于print
,icecream
具有以下优势:
- 方便地打印变量值和名称
- 通过色彩和缩进更好地输出结构化的数据(如嵌套的字典)。
- 可以通过配置输出程序上下文信息,如文件名、行号和父函数等。
下面我们比较一下print
和ic
:
from icecream import ic a = {"日期":"2024-2-12", "温度":15, "xx":[1,2,3,4,5,6]} b = {"日期":"2024-2-12", "温度":15, "xx":[1,2,3,4,5,6]} c = [a,b] print(c) ic(c)
运行结果:
相较于print
,ic
提供了更易读的输出。
下面是ic
的一些常用用法,完整的文档可以查看https://github.com/gruns/icecream。基本上print
能做的事情,ic
都可以做的更好。
为了节省空间,下面代码省略了
from icecream import ic
- 输出变量
def foo(i): return i + 333 ic(foo(123)) d = {'key': {1: 'one'}} ic(d['key'][1]) class klass(): attr = 'yep' ic(klass.attr)
- 查看函数执行过程
def foo(a): ic() if a % 2 == 1: ic() b = True else: ic() b = False return b is_odd = ic(foo(12))
运行结果:
- 禁用/启用
ic
输出
可以通过ic.disable()
,ic.enable()
禁用,启用ic的输出。
ic(1) ic.disable() ic(2) ic.enable() ic(3)
运行结果:
- 配置
可以通过ic.configureOutput(prefix, outputFunction, argToStringFunction, includeContext, contextAbsPath)
配置ic的输出。
- prefix:前缀,是一个字符串或返回字符串的函数。默认值是
ic|
- outputFunction:是一个接收字符串的函数,如果提供,则用ic的输出调用该函数。默认值是
stderr
。 - argToStringFunction:一个函数,返回对象的字符串形式。默认值是
pprint.pformat()
。 - includeContext:是否包含上下文信息。如果为True,则将ic()调用的文件名、行号和父函数添加到输出中。默认值是 False。
- contextAbsPath:上下文绝对路径。如果为True,则输出绝对文件路径。默认值为False。
例如,下面通过设置outputFunction
将信息输出到文件中。
from icfrom icecream import ic import time def add(a, b): return a + b def to_file(s): with open('debug.txt', 'a') as f: f.write( time.strftime("%c", time.localtime())+ ' ' + s + '\n') ic.configureOutput(prefix="Debug|", outputFunction=to_file, includeContext=True) ic(add(11,22))