你能在循环中跳转到第n次迭代吗?

时间:2014-09-04 14:33:24

标签: python pdb

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吗?

2 个答案:

答案 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