Consider following Python 2.x code snippet.
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")
Output of this script (given file.txt has more than one line) is:
Line 1 from file
Before del
__exit__ called
After del
I'm interested about __exit__ call specifically.
What triggers execution of his method? For what we know, code never left with statement (it "stopped" after yield statement and never continued). Is it guaranteed that __exit__ will be called when reference count of generator drops to 0?
finally: python.org/dev/peps/pep-0343fh2 = fhto see if reference count enters into it, but it shouldn't.