2011-06-01 28 views
9
from contextlib import contextmanager 

@contextmanager 
def context(): 
    print "entering" 
    yield 
    print "exiting" 

def test(): 
    with context(): 
     for x in range(10): 
      yield x 

for x in test(): 
    if x == 5: 
     break # or raise 

çıkışı: İçerik yöneticilerini jeneratörler içinde kullanmanın anlamlı bir yolu var mı?

entering 

() for -loop

kesilir piton otomatik bağlam __exit__ yöntemi çağırmak için bir yol var mı? Ya da aynı amacı elde etmenin başka bir yolu? Jeneratörler ve içerik yöneticileri hakkında bildiklerim, bunun mümkün olmadığından şüphelenir, ancak bu, içerik yöneticilerini jeneratörler içinde işe yaramaz hale getirir, değil mi? Bana öyle geliyor ki, bir yield ifadesinin içinde bir with bloğu kırmızı bayrak kaldırmalı, içerik yöneticisi __exit__'u çalıştıramıyor olabilir. try/finally fıkra ile

cevap

15

Eh, bir bağlamda verim sarabilirdiniz() fonksiyonu:

from contextlib import contextmanager 

@contextmanager 
def context(): 
    print "entering" 
    try: 
     yield 
    finally: 
     print "exiting" 

def test(): 
    with context(): 
     for x in range(10): 
      yield x 

for x in test(): 
    if x == 5: 
     break # or raise 

çıkışı:

entering 
exiting 

Düzenleme: Bir deneyin: yardım (contextmanager), bir "try/finally" cümlesiyle verimi sardığı "tipik" kullanım örneğini gösterecektir. Basit ve etkili bir örnek için

+1

+1. – jathanism

+2

Yapmanız gereken şey tam olarak budur: Döngüden sonra 'test()' silinir, 'GeneratorExit()' yi "get x" değerine yükseltir. Bu da 'with: 'bloğu ile biter. Daha sonra içerik yöneticisi “GeneratorExit()” i tekrar yakalar ve onu “bağlam” daki verim ile artırır - ve onu yakalamak zorunda olduğunuz yer budur, aksi takdirde “bağlam” burada bitecektir (bu da sonuçta bir jeneratördür, yani bu istisna) temizleme yapmadan sessizce sona erer. Dokümanlar şöyle der: "Böylece, bir denemeyi kullanabilirsiniz ... hariç ... son olarak hatayı düzeltmek için (varsa) veya bazı temizleme işlemlerinin yapıldığından emin olun" –

İlgili konular