2014-09-04 74 views
0
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吗?

+0

在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

+0

@fredtantini:i == k的条件断点将停在正确的位置,但不会跳过对i Ian 2014-09-04 14:49:37

回答

2

你不能'前进'并且回来,没有。您只能按照书面执行循环;去迭代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: 
+0

是否跳过foo(0),foo(1)等的评估? – Ian 2014-09-04 14:43:19

+0

@伊恩:不,它会正常运行代码。 – 2014-09-04 14:43:43

+0

@Ian:如果您想完全更改代码流,则必须更改代码。调试只能让您按照书面执行代码。 – 2014-09-04 14:44:17

0

我现在不能测试此权利,但我相信你可以使用condition命令:

条件bpnumber [状态]
条件是一个表达式在得到断点之前必须评估为true。如果条件不存在,则删除任何现有条件;即断点是无条件的。

condition <insert line num> i == k

+0

OP想要完全跳过中介迭代。 – 2014-09-04 14:53:35

+0

@MartijnPieters啊我明白了。我会在这里留下这个情况,以防其他人正在寻找我所描述的内容。 – KronoS 2014-09-04 17:19:02

相关问题