调试Python代码,谁没经历过print地狱呢。代码跑起来一堆输出,分不清哪个是哪个,删的时候还怕删错。今天说个替代品,叫IceCream,用起来比print顺手多了。
先看个对比。print调试是这样的,print(a),输出只有值,你得自己加标签,print('a=', a)。IceCream不一样,ic(a),自动输出变量名和值,ic| a: 42。不用你手动写标签,省事。
装它很简单,pip install icecream,就一行命令。装完直接from icecream import ic,然后该干嘛干嘛。
咱们说说实际用法。你有个函数,想看看参数进来是啥,ic(foo)就完事了。函数调用也直接看,ic(add(1, 2)),输出结果,还带上函数名和参数,一眼就明白哪个调用出了错。
多值调试,一次传多个参数,ic(a, b, c),每行一个,独立输出。比print写一堆加号强多了,也不用担心格式化字符串漏了个花括号。
它还能看执行位置。print你不知道在哪行打的,ic自动带文件路径和行号,ic| test.py:12 in foo() at 2, a=42。这个信息很关键,尤其在多个文件里找问题的时候。
有个功能特别实用,程序崩溃退出时,自动打印所有ic调用过的变量和值。你想想,你没加try except,程序直接崩了,print的输出早就刷没了。ic不一样,它把历史记录在内存里,退出前给你倒出来。这个叫ic.disable()和ic.enable()控制开关,还有ic.configureOutput()自定义格式。
再说一个场景。你写了个循环,想看看每次迭代的变量变化。print写一行,输出几十行,得自己数。用ic,每次迭代自动带上当前索引,ic| i=0, total=5,ic| i=1, total=3,一目了然。
有人问,会不会影响性能。说实话,比print稍微慢一点,多了点反射操作。日常调试没问题,生产环境代码里记得删掉或者用ic.disable()关掉就行。
还有个好处,它输出到stderr而不是stdout。你调试的信息跟正常输出分开了,重定向的时候不会混在一起。用print的话,全挤在stdout里,日志文件乱七八糟。
咱们团队里有人不习惯,用了一周就回不去了。你把它当成一个更好的print就行,不用改思维模式,上手很快。写代码临时调试,加一行ic,看完删掉,比print的体验好一个档次。
如果你还在用print,下次遇到复杂bug,试试ic。不用装一堆插件,不需要配置IDE,就一个pip install,比print多花不了几秒。调试这个事,工具顺手才能节省时间。