2015-04-17 14 views
5

Ich möchte etwas wie folgt aus:Wie mache ich einen Contextmanager mit einer Schleife innerhalb?

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() 

Aber contextmanager funktioniert nicht, weil es der Generator genau einmal erhalten erwartet.

Der Grund, warum ich das will, ist, weil ich im Grunde meinen eigenen Brauch für Schleife machen möchte. Ich habe eine modifizierte IPython, die verwendet wird, um Testgeräte zu steuern. Es ist offensichtlich eine vollständige Python-REPL, aber meistens ruft der Benutzer nur vordefinierte Funktionen (ähnlich der Bash-Eingabeaufforderung) auf, und es wird nicht erwartet, dass der Benutzer ein Programmierer ist oder mit Python vertraut ist. Es muss eine Möglichkeit geben, bei jeder Iteration willkürlichen Code mit Setup/Bereinigung und Ausnahmebehandlung zu durchlaufen, und es sollte ungefähr so ​​einfach sein wie oben mit Anweisung.

Antwort

7

Ich denke, ein Generator funktioniert besser hier:

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') 

geben:

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

Python betritt und verlässt einen with Block nur einmal, so dass Sie nicht/Ausgang haben kann Logik int eingeben Schritte, die wiederholt ausgeführt würden.

+0

Ich wusste, dass es so etwas einfach wäre. Vielen Dank! – jpkotta

Verwandte Themen