2015-04-17 13 views
5

Voglio qualcosa di simile:Come si crea un gestore di contesto con un loop all'interno?

from contextlib import contextmanager 

@contextmanager 
def loop(seq): 
    for i in seq: 
     try: 
      do_setup(i) 
      yield # with body executes here 
      do_cleanup(i) 
     except CustomError as e: 
      print(e) 

with loop([1,2,3]): 
    do_something_else() 
    do_whatever() 

Ma contextmanager non funziona perché si aspetta che il generatore di cedere esattamente una volta.

Il motivo per cui voglio questo è perché fondamentalmente voglio creare il mio loop personalizzato. Ho un IPython modificato che viene utilizzato per controllare le apparecchiature di test. Ovviamente è un REPL Python completo, ma la maggior parte delle volte l'utente chiama semplicemente funzioni predefinite (simile al prompt di Bash) e l'utente non dovrebbe essere un programmatore o familiare con Python. Ci deve essere un modo per eseguire il loop su un codice arbitrario con setup/cleanup e gestione delle eccezioni per ogni iterazione, e dovrebbe essere abbastanza semplice da digitare come sopra con l'istruzione.

risposta

7

Credo che un generatore funziona meglio qui:

def loop(seq): 
    for i in seq: 
     try: 
      print('before') 
      yield i # with body executes here 
      print('after') 
     except CustomError as e: 
      print(e) 

for i in loop([1,2,3]): 
    print(i) 
    print('code') 

darà:

before 
1 
code 
after 
before 
2 
code 
after 
before 
3 
code 
after 

Python entra ed esce un blocco with solo una volta, quindi non si può avere la logica int la entrare/uscire passi che sarebbero stati fatti ripetutamente.

+0

Sapevo che sarebbe stato qualcosa di semplice. Grazie! – jpkotta

Problemi correlati