42 -> for i in range(n):
43 foo(i)
我在pdb会话中间。我想使用i = k
跳转到循环迭代,而不评估foo(i)
的{{1}},然后继续评估i < k
foo(i)
。如果我前进一行
i > k
设置42 for i in range(n):
43 -> foo(i)
和i = k
,然后continue
在下一次迭代时返回1。我可以转到i
吗?
答案 0 :(得分:2)
你不能向前跳过&#39;然后,没有。你只能按照书面执行循环;要进行迭代k
,您 要通过所有中间步骤。那是因为Python无法知道状态是否会在迭代之间彻底改变,你不能只是跳过那里的迭代。
您始终可以在上下文中执行单个表达式。您可以运行foo(k)
并观察返回的值。你甚至可以操纵很多状态。你无法进入for
使用的迭代器对象来跳过。
如果在运行调试器之前更改测试下的代码是一个选项,则可以使用for
循环共享迭代器:
r = range(n)
it = iter(r)
for i in it:
foo(i)
现在你可以将it
提升到更晚的时间点(例如next(it)
)。问题是你不能倒回这样的迭代器。
下一步是生成可以倒带的自定义迭代器:
class ControllableIterator(object):
def __init__(self, sequence):
self.pos = 0
self.seq = sequence
def __iter__(self): return self
def next(self):
try:
val = self.seq[self.pos]
except IndexError:
raise StopIteration
self.pos += 1
return val
__next__ = next # Python 3
并使用:
r = range(n)
it = ControllableIterator(r)
for i in it:
foo(i)
在这里,您可以将it.pos
设置为不同的值,for
将很乐意跟进。这个仅适用于序列,而不仅仅适用于任何迭代。
演示:
$ bin/python test.py
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(19)<module>()
-> r = range(100)
(Pdb) l
14
15 def foo(i):
16 print i
17
18 import pdb; pdb.set_trace()
19 -> r = range(100)
20 it = ControllableIterator(r)
21 for i in it:
22 foo(i)
23
[EOF]
(Pdb) n
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(20)<module>()
-> it = ControllableIterator(r)
(Pdb)
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(21)<module>()
-> for i in it:
(Pdb)
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(22)<module>()
-> foo(i)
(Pdb)
0
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(21)<module>()
-> for i in it:
(Pdb)
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(22)<module>()
-> foo(i)
(Pdb)
1
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(21)<module>()
-> for i in it:
(Pdb) it.pos = 50
(Pdb) n
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(22)<module>()
-> foo(i)
(Pdb)
50
> /Users/mj/Development/venvs/stackoverflow-2.7/test.py(21)<module>()
-> for i in it:
答案 1 :(得分:0)
我现在无法对此进行测试,但我相信您可以使用condition
命令:
条件bpnumber [条件]
Condition是一个表达式,在断点被接受之前必须求值为true。如果条件不存在,则删除任何现有条件;即,断点是无条件的。
condition <insert line num> i == k