在这个问题中,我定义了一个包含上下文管理器的上下文管理器。最容易正确地完成这种嵌套的方式是什么?我最终在
原始代码来自问题:
self.__enter__()
中调用了self.temporary_file.__enter__()
。然而,在self.__exit__
中,如果出现异常,我非常确定必须在finally块中调用self.temporary_file.__exit__(type_, value, traceback)
。如果在self.__exit__
中出现问题,我应该设置type_、value和traceback参数吗?我检查了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)
@contextlib.contextmanager
很方便,但是仍然有一些情况需要使用手动定义了__enter__
和__exit__
方法的类。你有关于这样做的建议吗? - Zearinself.temporary_file = tempfile.TemporaryFile('r+')
移动到 init 语句中。 - hum3