写Python最头疼的事是什么?我猜你会说调试bug。我过去也是这样。天天对着print输出,满屏幕的调试信息看得眼都花了。
后来我发现了一个工具,叫IPython的调试功能,准确来说是它的%debug魔法命令。这玩意儿救了我的命。你不需要再塞一堆print到代码里,也不需要反复运行程序。
举个例子。你写了个爬虫,跑到一半崩了。正常情况下你得加print看哪里错了。用%debug就简单多了。在异常发生后,直接输入%debug,它会自动把你带到出错的地方。你可以检查所有变量的值,一步步往前推,看哪个逻辑出了问题。
使用方法特别简单。在你的代码里遇到异常时,不要急着改代码。先跑一遍,看到Traceback之后,打开IPython或Jupyter Notebook,输入%debug,会弹出一个调试界面。界面里有个(Pdb)提示符,等着你发号施令。输入where看看当前在哪个函数里,用list看代码上下文,用p 变量名查看变量值。
记得有一次我写的处理Excel的脚本出了bug。数据量很大,上千行。用print查的话,我得一遍遍跑,每次加一个print,跑完全程看结果,再改。花了我两个多小时。后来用了%debug,只用了十分钟。我直接在调试器里看每个循环里df.shape的变化,发现是某列数据里有空值导致的。定位到问题后改了代码,程序就跑通了。
另一个好用的小技巧是s命令。如果你在调试器里想看某一行具体执行了什么,输入s回车,它会进入那个函数内部。这在调试第三方库的时候特别有用。不用翻文档,直接看源码怎么跑的。
当然,别忘了q命令可以退出调试器。有时候看完了变量,想继续改代码,按q就回到原环境了。
还有一个让调试更顺手的工具是pdb.set_trace()。在代码里想暂停的地方写一行import pdb; pdb.set_trace(),程序跑到这就会停住,弹出调试器。你就可以用之前的命令看变量、一步步走。我经常在怀疑有问题的循环体里加这个,比print不知道高到哪里去了。
可能有朋友会担心,这个工具难吗?不难。比学print还要简单。print你得自己加标记,得想清楚要输出什么。用调试器你什么都不用想,只要知道几个基础快捷键就行。
我现在写Python,从来没有用过print调试。遇到bug就用%debug或者pdb.set_trace()。调试效率起码提升了十倍,真的是有手就能用。