群发资讯网

别再用 print 定位 bug 了,Python 自带的这个小工具,调试速度提

别再用 print 定位 bug 了,Python 自带的这个小工具,调试速度提升三倍不止。
调试代码的时候,你是不是还在到处加 print 语句?
我以前也是。写一行代码,加一个 print 。变量值变了加一个,循环跑几轮加一个。代码跑起来,终端一堆数字乱飞。得瞪大眼睛一条条看。跑完了还得回头删这些 print 。要是忘了删,提交到仓库,同事看了都懵。
这个习惯我用了好几年。直到有一天,我接了一个别人的项目。几千行代码,里面有几十个 print 。我只想找到其中一个 bug 在哪。看着满屏的输出,头都大了。
后来一个老前辈告诉我,Python 自带了一个叫 pdb 的调试工具。学这东西,花不了你半小时。用上了之后,解决 bug 的速度提升三倍不止,一点不夸张。
pdb 是 Python 标准库里的一个模块,叫“调试器”。它的用法很简单。你只需要在你怀疑有问题的代码那一行之前,加一句代码:
import pdb; pdb.set_trace()
程序运行到这一行,就会 自动停下来 。不像 print 只会一股脑把所有结果打出来。停下来之后,你可以在这个“断点”旁边,像一个侦探一样检查一切。
比如你面前有个变量叫 user_age 。在 print 时代,你得加一句 print(user_age) 。用 pdb ,程序停住后,直接输入变量名 user_age 再回车。它的值就显示出来了。不用改代码,不用重启程序。
你想看某个列表里的第三个元素?输入 my_list[2] 。想看字典里的某个键?输入 my_dict["key"] 。这些操作不会影响原程序。查完了,程序还是停在那里等你。
最让人开心的是,你可以 一步一步执行代码 。输入 n ,然后回车。程序就往前走一行。你可以亲眼看着每个变量是怎么变化的。不像 print ,只能看到最终结果。中间发生了什么,完全靠猜。
我举个例子。假设你的函数里有个 for 循环在算总分。用 print 的话,要么打出一大堆中间结果,要么只看到最后结果。用 pdb ,你可以每循环一次就停下来看看。第一次循环,总分是多少。第二次循环加上那个数值后,总分变成了多少。 哪一步出问题了,一眼就能看到 。
还有更高级的玩法。想跳过一个复杂的函数直接看后面结果?输入 c 可以继续运行到下一个断点。想看看调用栈,知道这个函数是被谁调用的?输入 w 。想查看当前所有局部变量?输入 locals() 。
这些东西用 print 来实现,需要你提前把所有可能用到的变量都写出来。写出来之后还得猜哪里会出问题。出问题之后还得把结果和代码对起来看。折腾半天。用 pdb ,一切都在交互式环境里随时操作。
记住这几个命令就够了。 n 下一步,c 继续,s 进入函数内部,q 退出调试 。这四个命令解决 90% 的情况。其他的用到再查也行。
别觉得学这个麻烦。你花在删 print 语句上的时间,加起来比学 pdb 的时间多得多。而且少了那些干扰信息,你的思路会更清晰。Bug 藏得再深,也能把它揪出来。
试试看。下次遇到 bug,别急着加 print 。先试试 pdb 。你会回来感谢我的。