IceCream:Python 调试不用再写 print()

gruns/icecream 在 GitHub 上已经拿到 10,058 Star 了。

这是一个 Python 调试库,专门干一件事:让 print 调试变得顺手。你不再需要写 print("foo =", foo),一个 ic(foo) 就能同时打出变量名和值。

正文顶部截图

1、这玩意儿是干嘛的

写 Python 的人几乎都用 print() 调过代码。问题是 print() 太原始了:变量名和值分开写,嵌套字典打印出来挤成一团,多行输出混在一起看不清楚。

IceCream 用 ic() 替代 print(),一行代码同时输出变量名和值,数据结构自动格式化,还有语法高亮。它还能打印执行上下文:文件名、行号、所在函数。这些 print() 统统给不了。

README区域截图

2、基本用法

装起来很简单:

pip install icecream

导入之后直接用:

from icecream import ic

def foo(i):
    return i + 333

ic(foo(123))

输出:

ic| foo(123): 456

ic() 会自动检测传入的是变量还是表达式,两边一起打印。字典、列表嵌套再深也能展开看。

不带参数调用 ic(),它会打印当前位置信息:

from icecream import ic

def foo():
    ic()
    first()
    if expression:
        ic()
        second()

输出:

ic| example.py:4 in foo()
ic| example.py:11 in foo()

这在追踪代码执行路径时很实用。

3、几个顺手的设计

ic() 返回传入的参数本身,所以可以无缝插进现有代码:

a = 6
def half(i):
    return i / 2
b = half(ic(a))  # 输出 a 的值,同时正常参与计算

ic.format() 把输出变成字符串,方便接进日志系统:

from icecream import ic
s = 'sup'
out = ic.format(s)  # 返回 "ic| s: 'sup'"

ic.disable()ic.enable() 控制全局开关,上线前不需要逐行删除调试代码。

install() 可以把 ic() 注入 Python 内置模块,所有文件直接调用,不用再逐个导入:

from icecream import install
install()

输出格式也能自定义。前缀可以改成任意字符串或函数,输出目标可以从 stderr 切到 logging,参数序列化方式也能替换。甚至可以用 functools.singledispatch 注册特定类型的格式化函数,比如 numpy 数组只打印 shape 和 dtype。

4、适合哪些人用

  • 还在用 print() 调 Python 代码的开发者
  • 需要快速查看变量状态和代码执行路径的人
  • 项目里调试代码和日志系统需要灵活切换的场景

IceCream 只干一件事:把 print 调试的体验提上去。它没打算替代 pdb 这类正经调试器,只是在日常开发里让那几十行 print() 写得快一点、看得清楚一点。对大多数 Python 开发者来说,这就够了。

只干一件事:把 print 调试的体验提上去。它没打算替代 pdb 这类正经调试器,只是在日常开发里让那几十行 print() 写得快一点、看得清楚一点。对大多数 Python 开发者来说,这就够了。

更多推荐