次のPython 2.xコードスニペットを検討してください。私は、具体的__exit__
呼び出しに関する興味with文とコンテキストマネージャの__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__
が呼び出されることが保証されていますか?
2回目の次のコールは、not-yet-minimalの例から残ったものでした。私は固定コードスニペット、それは今正確です。 –
この質問はCPythonについてのみですか? – MSeifert
意味的には、「最終的に」https://www.python.org/dev/peps/pep-0343/ –