再用 `print` 进行 Python调试,你就OUT啦!
哎,昨天晚上十点多,还在沙发上拿着电脑边追剧边敲代码,突然小李发微信过来问我一个巨“灵魂”的问题:“东哥你说用 print 还行不行啊,怎么别人都说 print 调试很土了?”
我第一反应,哈哈,估计又是他在群里被怼了。其实我真的是深有同感——以前那会儿刚入门 Python,每次一出 bug,手一抖就加一堆 print(),那屏幕上瞬间花里胡哨,连自己都晕。你说 print 能不能用?能用,真没毛病,但真的,有点跟不上趟了。
print 真的已经跟不上节奏了
说个特别生活的场景,周末那会我给老婆做饭的时候手机响了,群里有人在问:“为什么我的 print 不显示值?”你别笑,真的很多人遇到 print 换行不对、编码乱码,最气人的是那种——你加了十行 print,输出全搅一起,调试还没调明白,自己脑子已经乱套了。
有次我写爬虫,碰到爬到一半就死循环,然后我加了 print,结果整个终端被刷爆,历史记录直接丢失,啥都找不到。那感觉,就跟你在大街上喊“谁偷了我的钱包”,人山人海全是回音,真受不了。
用 logging,一步到位
其实吧,正常项目 print 只能算应急,真遇到复杂点的情况,推荐直接上 logging。为什么?你可以自定义日志级别、格式、输出文件,甚至还能按时间轮转日志文件。比如你只想在开发环境看到 DEBUG,线上只收 ERROR,logging 这点就很香。
比如随手一段代码:
import logginglogging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s')
defdivide(a, b):
logging.info(f"start divide: {a} / {b}")
try:
result = a / b
logging.info(f"result is {result}")
return result
except Exception as e:
logging.error("divide error", exc_info=True)
returnNone
divide(10, 2)
divide(10, 0)
你看啊,这玩意 debug、info、error 层次分明,报错还能看到堆栈,一搜就定位,比你在文件里满天找 print 爽多了。而且还能写到文件里,方便追溯。公司里有时候查生产事故,全靠日志溯源,print 根本指望不上。
真调试,还是得用断点 + IDE
说到这,我得插一嘴。我就不信你没用过 PyCharm,调试直接断点点下去,变量一目了然,鼠标悬停还能看实时值。上次我们组做数据清洗,几十层 if 嵌套,光靠 print 不得疯?结果 PyCharm 直接断点、单步、查看堆栈、变量追踪——全都清楚明了,省时省力。
对了,有次我在地铁上用 VSCode 远程连公司服务器调试,手机热点信号都不稳,都能愣是追出 bug 细节。print 这时候真帮不上啥。
还能怎么玩?pdb 手动调试
当然,你说 IDE 没得用咋办?终端环境?老办法,pdb。直接:
import pdbdeffoo():
a = 10
b = 0
pdb.set_trace()
print(a / b)
foo()
一到 set_trace 直接交互窗口,手敲 n/s/l/p 命令,想看啥看啥。前几天帮运维排线上脚本问题,没界面,pdb 保命。
自定义装饰器+日志
前两天楼下咖啡店里遇到个做 Flask 的哥们,边喝咖啡边跟我说他自己写了个装饰器,函数调用前后自动打日志,连 print 都不用手敲,代码还干净,回头有空可以这样玩:
deflog_func(func):
defwrapper(*args, **kwargs):
print(f"call {func.__name__} with {args}, {kwargs}")
res = func(*args, **kwargs)
print(f"{func.__name__} returned {res}")
return res
return wrapper@log_func
defadd(a, b):
return a + b
add(2, 3)
虽然 print,哈哈,但这思路放到 logging 上更牛,干净利落自动追踪。
print 不是不行,但真的太弱了
有时候赶工、写脚本、随手调试,print 临时玩玩无妨。可真要进项目、查线上 bug、多人协作,print 绝对 hold 不住,日志、IDE、pdb、装饰器这些都比 print 香太多。
反正现在谁还靠 print,大概率要被同事笑话——不是我说的,是我们组小王亲口说的,哈哈哈。对了,说这么多,我水壶里水没了,去倒个水,回来再接着唠。
反正你要是还死磕 print,兄弟,真就 out 啦。
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领