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
__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
+1. – jathanism
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" –