我有一个类,它的对象使用系统资源(例如创建临时文件),需要进行清理。至少在程序结束时需要进行清理。到目前为止,我一直在使用contextmanager
来实现这一点,例如:
@contextlib.contextmanager
def tempdir(prefix='tmp'):
tmpdir = tempfile.mkdtemp(prefix=prefix)
try:
yield tmpdir
finally:
shutil.rmtree(tmpdir)
with tempdir() as tmp:
do_something(tmp)
这样可以确保资源在使用完后立即释放,对于我大多数的需求来说这种方法很好用。然而,当使用Python交互式环境(比如
ipython
)时,我发现这种模式失效了。在这种情况下,整个会话都需要放在一个with
块中,这并不是很实用(事实上,ipython
只会一次性评估所有块,因此整个交互性会消失)。有没有一种方法可以确保清理资源,同时仍然能在交互式会话中使用呢?在C++中,可以通过析构函数来实现清理。Python的
__del__
语句也类似,但我被告知要避免使用__del__
,因为它不可靠。特别地,不能保证解释器退出时还存在的对象会调用__del__
。那么,在这种情况下,__del__
是否仍然是最佳解决方案?如果contextmanager
方法与交互式会话不兼容,为什么它被推荐作为最常用的“Pythonic”方法呢?