11

对我来说,最惯用的调用方式tempfile.mkstemp()是:

with tempfile.mkstemp() as fd, filename:
    pass

然而,这显然(?)提出了AttributeError: __exit__

使用 try-finally 显式调用os.close(fd)是解决此问题的一种简单方法,但感觉像是违反了应该有一个——最好只有一个——明显的方法来做到这一点。

有没有办法“解决”这个问题,tempfile或者是否有理由以这种方式实施?

4

2 回答 2

7

with语句的工作方式在PEP 343中定义,包括其所谓的上下文管理协议

该 PEP 建议由enter () 和exit () 方法组成的协议称为“上下文管理协议”,实现该协议的对象称为“上下文管理器”。

mkstemp不返回上下文管理器,即实现__enter____exit__方法的对象,因此不兼容。

一个明显的解决方法是创建一个实现上下文管理器协议的包装类。

于 2013-08-27T06:34:45.713 回答
5

在该tempfile模块中,还有其他更适合创建临时文件的方法,例如TemporaryFile()和其他。

特别是,如果您不想删除文件,请使用NamedTemporaryFile(),并为其提供delete=False参数。

于 2013-08-27T06:37:55.830 回答