Вы не можете «пропустить вперед» и обратно, нет. Вы можете выполнить цикл только как написанный; чтобы добраться до итерации 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:
ли ответы на http://stackoverflow.com/questions/14139817/python-in-pdb-is-it-possible-to-enable-a-breakpoint-only-after- n-hit-counts работают для вас? – fredtantini
@fredtantini: условная точка останова при i == k остановится в нужном месте, но не пропустит оценку циклов с i
Ian