다음 Python 2.x 코드 스 니펫을 고려하십시오. 내가 특별히 __exit__
통화에 대한 관심with 문 및 context manager의 __exit__ 메소드에서 내림차순
Line 1 from file
Before del
__exit__ called
After del
:이 스크립트의
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")
출력은 (주어진 file.txt를 하나 개 이상의 라인을 가지고).
그의 메소드 실행을 트리거하는 요인은 무엇입니까? 우리가 아는 한, 코드는 결코 with
문장을 남기지 않았습니다. (이것은 yield
문장 이후에 "멈추었"고 결코 계속되지 않았습니다). 제너레이터의 레퍼런스 카운트가 0으로 떨어지면 __exit__
이 호출 될 것입니다.
두 번째 다음 호출은 아직 미미한 예제의 나머지 부분이었습니다. 코드 스 니펫을 수정했는데 정확합니다. –
이 질문은 CPython에 관한 것입니까? – MSeifert
의미 적으로는 'finally'를 갖는 것과 유사합니다. https://www.python.org/dev/peps/pep-0343/ –