Python 2.x kod snippet'ini takip etmeyi düşünün. Ben özellikle __exit__
çağrısı hakkında ilgileniyorumİçerme bildirimi ve içerik yöneticisi __exit__ yöntemi ile içten dışa aktarma
Line 1 from file
Before del
__exit__ called
After del
: Bu komut
from __future__ import print_function
class myfile(file):
def __exit__(self, *excinfo):
print("__exit__ called")
super(myfile, self).__exit__(*excinfo)
def my_generator(file_name):
with myfile(file_name) as fh:
for line in fh:
yield line.strip()
gen = my_generator('file.txt')
print(next(gen))
print("Before del")
del gen
print("After del")
Çıktı olan (verilen file.txt birden fazla hattı vardır).
Bu yöntemin uygulanmasını tetikleyen nedir? Bildiğimiz kadarıyla, kod hiçbir zaman with
bildirimini bırakmadı (yield
ifadesinden sonra "durdu" ve asla devam etmedi). Jeneratör referans sayısı 0'a düştüğünde __exit__
'un çağrılması garanti edilir mi?
İkincisi ikinci çağrı, henüz-olmayan-minimal bir örnekle bir artık oldu. Kod snippet'ini düzeltdim, şimdi doğru. –
Bu soru sadece CPython hakkında mı? – MSeifert
Öyle gözüküyordu: semantik olarak bir "nihayet" sahibi olmak benzer: https://www.python.org/dev/peps/pep-0343/ –