この質問では、コンテキストマネージャーを含むコンテキストマネージャーを定義しました。この入れ子を実現するための最も簡単な正しい方法は何ですか?self.temporary_file.__enter__()に電話してしまいましたself.__enter__()。ただし、では、例外が発生した場合に備えて、finallyブロックself.__exit__を呼び出す必要があると確信しています。self.temporary_file.__exit__(type_, value, traceback)何か問題が発生した場合、type_、value、およびtracebackパラメーターを設定する必要がありますself.__exit__か?チェックcontextlibしましたが、これを支援するユーティリティが見つかりませんでした。
質問の元のコード:
import itertools as it
import tempfile
class WriteOnChangeFile:
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.temporary_file = tempfile.TemporaryFile('r+')
self.f = self.temporary_file.__enter__()
return self.f
def __exit__(self, type_, value, traceback):
try:
try:
with open(self.filename, 'r') as real_f:
self.f.seek(0)
overwrite = any(
l != real_l
for l, real_l in it.zip_longest(self.f, real_f))
except IOError:
overwrite = True
if overwrite:
with open(self.filename, 'w') as real_f:
self.f.seek(0)
for l in self.f:
real_f.write(l)
finally:
self.temporary_file.__exit__(type_, value, traceback)