如何在Python调试器中跳过列表推导?
在 pdb
中,使用 next
指令时,它不会跳过列表推导式,而是会逐个执行每一次循环。这意味着你不能直接跳到列表推导式之后的下一行去调试。
为了应对这个问题,我不得不把代码列出来,在下一行设置一个断点,然后继续执行到那个断点。这种做法很麻烦,我觉得应该有更好的方法。
2 个回答
3
我想详细解释一下Sven的回答,因为我最近需要向同事描述一下until
和next
的用法。这些概念并不仅仅适用于列表推导,而是适用于所有循环。
until
命令的作用类似于next
,但它的特点是会一直执行,直到代码运行到同一个函数中行号比当前行号高的那一行。
这意味着你可以用until
跳过循环。
为了完整起见,我也简单介绍一下step
和next
:
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)
继续执行,直到达到一个比当前行号大的行,或者直到当前的代码块返回