42 -> for i in range(n):
43 foo(i)
我在这里,在一个pdb会议中。我想跳转到循环迭代,没有评估foo(i)
的i < k
,然后继续评估foo(i)
的i > k
。如果我向前一步一行你可以跳转到循环中的第n次迭代吗?
42 for i in range(n):
43 -> foo(i)
设置,并continue
,然后i
追溯到1的下一次迭代。我可以使它变成k + 1
吗?
42 -> for i in range(n):
43 foo(i)
我在这里,在一个pdb会议中。我想跳转到循环迭代,没有评估foo(i)
的i < k
,然后继续评估foo(i)
的i > k
。如果我向前一步一行你可以跳转到循环中的第n次迭代吗?
42 for i in range(n):
43 -> foo(i)
设置,并continue
,然后i
追溯到1的下一次迭代。我可以使它变成k + 1
吗?
你不能'前进'并且回来,没有。您只能按照书面执行循环;去迭代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:
是否跳过foo(0),foo(1)等的评估? – Ian 2014-09-04 14:43:19
@伊恩:不,它会正常运行代码。 – 2014-09-04 14:43:43
@Ian:如果您想完全更改代码流,则必须更改代码。调试只能让您按照书面执行代码。 – 2014-09-04 14:44:17
在http://stackoverflow.com/questions/14139817/python-in-pdb-is-it-possible-to-enable-a-breakpoint-only-after-请问答案n-hit-counts适合你吗? – fredtantini 2014-09-04 14:41:19
@fredtantini:i == k的条件断点将停在正确的位置,但不会跳过对i
Ian
2014-09-04 14:49:37