你如何跳过Python调试器(pdb)中的列表理解?

时间:2011-06-10 15:28:43

标签: python list-comprehension pdb

pdb中,next指令不会跳过列表推导,而是逐步完成每次迭代。有没有办法跨过它们,以便在列表理解后的下一行继续调试?

我不得不求助于列出代码,在下一行设置断点,然后继续执行到下一个断点。这很烦人,我认为必须有更好的方法。

2 个答案:

答案 0 :(得分:62)

您可以使用until命令。 help untilpdb的输出:

  

UNT(IL)
  继续执行,直到数字大于当前的行   到达一个或直到当前帧返回

答案 1 :(得分:2)

详细阐述了Sven的回复,因为我最近不得不向同事描述untilnext。它不是特定的列表理解stuck下一个而是for循环。:

  

until 命令与next类似,不同之处在于它明确地继续执行,直到执行到达同一函数中的行,其行号高于当前值。

这意味着您可以使用until

跨越循环

只是为了完整性来涵盖stepnext

  

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

这意味着它将按指令进行指导。注意,与;连接的指令将作为一条指令处理。

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

next 命令类似于步骤,但不会输入正在执行的语句中调用的函数。实际上,它在单个操作中一直执行函数调用到当前函数中的下一个语句。

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