Rozważ zastosowanie następującego fragmentu kodu Python 2.x.Plonowanie od wewnątrz instrukcją i __exit__ metoda menedżera kontekstu
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")
Wyjście z tego skryptu (podane plik.txt ma więcej niż jedną linię) jest:
Line 1 from file
Before del
__exit__ called
After del
Jestem zainteresowany o __exit__
rozmowy konkretnie.
Co powoduje uruchomienie jego metody? Z tego, co wiemy, kod nigdy nie opuścił instrukcji with
("zatrzymał się" po wydaniu yield
i nigdy nie kontynuował). Czy jest zagwarantowane, że __exit__
zostanie wywołany, gdy liczba referencyjna generatora spadnie do 0?
Drugie następne połączenie było pozostałością po nie-jeszcze-minimalnym przykładzie. Naprawiłem fragment kodu, teraz jest poprawny. –
To pytanie dotyczy tylko CPython? – MSeifert
Wydaje się, że jest tak: semantycznie jest to podobne do posiadania 'finally': https://www.python.org/dev/peps/pep-0343/ –