2014-09-04 4 views
0
42 -> for i in range(n): 
43  foo(i) 

여기는 내가 pdb 세션 중간에 있습니다. i < k에 대해 foo(i)을 평가하지 않고 으로 루프 반복으로 이동 한 다음 i > k에 대해 foo(i)을 계속 평가하고 싶습니다. 내가루프에서 n 번째 반복으로 이동할 수 있습니까?

에 선을 과감히 경우
42 for i in range(n): 
43 -> foo(i) 

i = kcontinue을 설정 한 다음 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

+0

@fredtantini : i == k에있는 조건부 중단 점은 올바른 위치에서 중단되지만 i Ian

답변

2

앞으로 건너 뛰거나 뒤로 이동할 수 없습니다. 루프는 작성된 대로만 실행할 수 있습니다. 반복하기 위해 k이 있으면 모든 중간 단계를 거치게됩니다. 왜냐하면 파이썬은 상태가 반복간에 근본적으로 바뀌는 지 알 방법이 없기 때문에 반복을 건너 뛰기로 결정할 수는 없습니다.

컨텍스트에서 항상 개별 식을 실행할 수 있습니다. 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) 

다른 가치와 forit.pos을 설정할 수 있습니다

다음 단계는 되감기 할 수있는 사용자 정의 반복자를 생성하는 것 행복하게 따라갈 것입니다. 이 은 반복 가능하지 않은 시퀀스에 대해서만 작동합니다.

데모 :

$ 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

+0

@Ian : 아니오, 정상적으로 코드가 실행됩니다. –

+0

@Ian : 코드 흐름을 완전히 변경하려면 코드를 변경해야합니다. 디버깅만으로 작성된 코드를 실행할 수 있습니다. –

0

지금이 권리를 테스트 할 수 없습니다,하지만 난 당신이 condition 명령을 사용할 수 있다고 생각 :

조건 bpnumber [조건]
조건 표현이다 중단 점이 존중되기 전에 true로 평가되어야합니다. 조건이 없으면 기존 조건이 제거됩니다. 즉, 브레이크 포인트는 무조건 부과된다.

condition <insert line num> i == k

+0

OP는 중간 반복을 건너 뛰기를 원합니다. –

+0

@MartijnPieters 아하겠습니다. 이것이 내가 설명했던 것을하려고하는 다른 누군가에게 유용 할 경우에 대비하여 여기에 남겨 두겠습니다. – KronoS

관련 문제