2012-07-05 7 views
8

Próbuję iterację listy, a ja potrzebuję do wykonywania określonej pracy wtedy i tylko wtedy, gdy iteracja osiągnął koniec listy, patrz poniższy przykład:iterację listy i obsługiwać StopIteration w Pythonie pięknie

data = [1, 2, 3] 

data_iter = data.__iter__() 
try: 
    while True: 
     item = data_iter.next() 
     try: 
      do_stuff(item) 
      break # we just need to do stuff with the first successful item 
     except: 
      handle_errors(item) # in case of no success, handle and skip to next item 
except StopIteration: 
    raise Exception("All items weren't successful") 

Wierzę, że ten kod nie jest zbyt Pythonic, więc szukam lepszego sposobu. Myślę, że idealny kod powinien wyglądać jak ten hipotetyczny element poniżej:

data = [1, 2, 3] 

for item in data: 
    try: 
     do_stuff(item) 
     break # we just need to do stuff with the first successful item 
    except: 
     handle_errors(item) # in case of no success, handle and skip to next item 
finally: 
    raise Exception("All items weren't successful") 

Wszelkie życzenia są mile widziane.

+0

zamień 'finally' na' else'? – WolframH

+0

Dlaczego "Wszystkie elementy nie były skuteczne" zamiast "Wszystkie elementy nie powiodły się"? Ten środkowy apostrof przerwie łańcuch/wyjątek, jeśli zostanie uruchomiony. Również do punktu WolframH, zobacz [docs] (http://docs.python.org/reference/compound_stmts.html#for) - "else" zamiast "finally" powinno działać. – thegrinner

+1

Warto zauważyć, że 'z wyjątkiem:' jest straszne - jeśli jest to tylko na przykład, dobrze, ale w każdym prawdziwym przykładzie, proszę tylko złapać konkretny wyjątek. –

Odpowiedz

16

Można użyć else po pętli, a kod w tym else jest wykonywana tylko wtedy, gdy nie break z pętli for:

data = [1, 2, 3] 

for item in data: 
    try: 
     do_stuff(item) 
     break # we just need to do stuff with the first successful item 
    except Exception: 
     handle_errors(item) # in case of no success, handle and skip to next item 
else: 
    raise Exception("All items weren't successful") 

ten można znaleźć w documentation for the for statement, istotnych elementów przedstawiono poniżej:

for_stmt ::= "for" target_list "in" expression_list ":" suite 
       ["else" ":" suite] 

break oświadczenie wykonany w pierwszej pakietu kończy pętlę bez wykonywaniaPakiet 210 klauzul.

+1

Jak już pisałem. +1 - jest to najlepszy sposób na zrobienie tego. –

+0

Tak, to było oczywiste, dzięki! –

Powiązane problemy