如何在Python调试器中跳过列表推导?

53 投票
2 回答
6310 浏览
提问于 2025-04-16 19:19

pdb 中,使用 next 指令时,它不会跳过列表推导式,而是会逐个执行每一次循环。这意味着你不能直接跳到列表推导式之后的下一行去调试。

为了应对这个问题,我不得不把代码列出来,在下一行设置一个断点,然后继续执行到那个断点。这种做法很麻烦,我觉得应该有更好的方法。

2 个回答

3

我想详细解释一下Sven的回答,因为我最近需要向同事描述一下untilnext的用法。这些概念并不仅仅适用于列表推导,而是适用于所有循环。

until命令的作用类似于next,但它的特点是会一直执行,直到代码运行到同一个函数中行号比当前行号高的那一行。

这意味着你可以用until跳过循环。

为了完整起见,我也简单介绍一下stepnext

step命令用于执行当前行,然后停在下一个执行点。

这意味着它会逐行执行代码。需要注意的是,如果用;连接多条指令,它们会被当作一条指令来处理。

var A=0; var B=0 #Note: that will count as one instruction

next命令和step类似,但它不会进入被当前执行语句调用的函数。实际上,它会在一次操作中直接跳过整个函数调用,继续到当前函数中的下一条语句。

next可以帮助你跳过多条指令,如果一个函数中有多个变量定义,它会跳过所有这些定义。

下面是一个示例,展示了这个场景:

示例:pdb_until.py

aVar = 3
x = [i for i in range(0,30)]
bVar = 5

用Pdb运行这个:

python -m pdb pdb_until.py

开始我们的交互式会话:

> pdb_until.py(1)<module>()
-> aVar = 3
(Pdb) step                #our Input, we step
> pdb_until.py(2)<module>()
-> x = [i for i in range(0,10)]
(Pdb) next                #our Input, next
> pdb_until.py(2)<module>()
-> x = [i for i in range(0,10)]
(Pdb) next                #our Input, we are now stuck on line 2
> pdb_until.py(2)<module>()
-> x = [i for i in range(0,10)]
(Pdb) until               #our Input, until steps over (runs list comp)

来源: 《Python标准库示例》,Doug Hellmann

70

你可以使用 until 命令。在 pdb 中输入 help until 会显示以下内容:

unt(il)
继续执行,直到达到一个比当前行号大的行,或者直到当前的代码块返回

撰写回答