Python 调试器:毫不费力地提高您的调试技能
对于我们中的许多人来说,调试 Python 代码归结为添加打印语句并尝试根据输出推断正在发生的事情。这并不理想,但出于某种原因,人们只是不想接触 Python 调试器。
目录
<导航>- 使用打印调试代码
- 设置 Python 调试器断点
- 使用 Python 调试器
- Python 调试器命令
- 继续学习
使用 print 调试代码
如果您是使用 print
的人之一 对于调试,我不是在评判你 .学习 Python 很难。编程很难。生活艰难。我知道,如果您已经在苦苦挣扎,再学习另一件事似乎很烦人。并将该打印语句添加到您的代码中......这更容易。一点忏悔:我也一直这样做。它并不像某些人看起来的那么糟糕。
话虽如此,我将教你一个小技巧,就像在你的代码中添加打印语句一样简单。然而,这个技巧给你无限的调试能力,让你征服世界,如果你需要的话。
设置 Python 调试器断点
您不需要 IDE 即可正确调试代码。这个技巧总是有效的,即使在最简单的编辑器中,甚至在 Jupyter Notebooks 中也是如此。
诀窍归结为:使用指令 breakpoint()
设置所谓的断点 .无论您使用什么编辑器或 IDE,您都可以将它插入到您通常会放入该讨厌的打印语句的位置。
那么当你这样做时会发生什么?让我们来了解一下!创建一个简单的程序,如下所示:
def add_two(x): return x + 2 for i in range(1, 10): a = add_two(i) breakpoint() print(a)
当您运行它时,无论您是在 REPL、命令行还是在您的 IDE 中执行此操作,您都会被放入名为 PDB 的 Python 调试器中。但是现在呢?
使用 Python 调试器
当我启动上面的小程序时,会发生这样的事情:
$ python3 breakpointing.py > /home/erik/breakpointing.py(7)<module>() -> print(a) (Pdb)_
这里有几件事可看:
- 显示当前启动的文件(
breakpointing.py
) - 之后,它显示下一个即将运行的命令,但被对
breakpoint()
的调用中断 . - 最后,我们看到 pdb 提示符,等待我们的输入。
Python 调试器实际上是一个功能齐全的 Python shell,就像 REPL 一样。
此时,我们可以检查当前环境。看看a
的值是什么 现在是:
(Pdb) print(a) 3 (Pdb) print(i) 1
除了打印,您还可以使用 pdb 特定命令 p,如下所示:
(Pdb) p a 3 (Pdb_ p i 1
运行下一行
那么如果我们想运行下一行代码呢?有两种选择:
- 使用
s
或step
, 你执行当前行。之后,调试器会在第一个可能的情况下停止。 - 使用
n
或next
,您也执行当前行,但现在调试器继续运行,直到到达当前函数的下一行。
为了更清楚地说明这一点:step
愉快地进入一个函数调用并在该函数内部中断。相比之下,next
执行函数直到它返回,并在下一行中断。
其他调试器和 IDE 也将此称为“step into”(而不是 step)和“step over”(而不是 next)。
现在让我们使用这两个:
$ python3 breakpointing.py -> print(a) (Pdb) s 3 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) n -> breakpoint() (Pdb) n -> print(a) (Pdb) n 4 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) s --Call-- -> def add_two(x): (Pdb) s -> return x + 2 (Pdb) s --Return-- 5 -> return x + 2 (Pdb) s -> breakpoint() (Pdb)
如您所见,我们首先跳过对 add_two
的调用 与 n
.第二次,我们用 s
进入函数 .
Python 调试器命令
您可以自行尝试更多命令。我不会全部列出,只列出最有用的:
h
(帮助):打印所有可用的命令。也需要一个论点,例如h c
告诉你c
是什么 命令确实c
(继续):开始运行直到下一个断点l
(list):列出当前行周围的源代码p
:打印以下表达式的结果。您可以使用它而不是调用print()
pp
:漂亮的打印,对于打印字典等数据结构很有用- restart:重启当前程序
如需完整文档,请前往 Python 调试器页面,其中列出了所有命令。
不断学习
尽管这非常方便,但深入了解 IDE 提供的调试器是值得的。如果你是 VSCode 用户,我写了一篇关于如何在 VSCode 中调试 Python 代码的教程。
Python