2015-04-17 20 views
5

Böyle bir şey istiyorum:İçeride bir döngü ile bir contextmanager nasıl yapabilirim?

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

Ama jeneratör yalnızca bir kez verim beklediği için contextmanager çalışmaz.

Bunun nedenini yapmamın nedeni, temelde kendi özel döngüsünü yapmak istiyorum. Test ekipmanını kontrol etmek için kullanılan modifiye IPython'um var. Açıkçası tam bir Python REPL'dir, ancak çoğu zaman kullanıcı önceden tanımlanmış işlevleri çağırır (Bash komutuna benzer) ve kullanıcının bir programcı veya Python ile aşina olması beklenmez. Her bir yinelemede kurulum/temizleme ve istisna işleme ile bazı rasgele kodların üstesinden gelmenin bir yolu olmalı ve yukarıdaki ifadeyle yazılması basit olmalıdır.

cevap

7

Bir jeneratör daha iyi burada çalışır düşünüyorum:

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

verecektir:

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

Python girer ve girdiğiniz/çıkış int mantığı olamaz bu yüzden sadece bir kez with blok çıkar art arda yapılacak adımlar.

+0

Bunun gibi basit bir şey olacağını biliyordum. Teşekkürler! – jpkotta

İlgili konular