如何用“with”调用tempfile.mkstemp()? - 或者为什么不用__exit __()返回fd?

时间:2013-08-27 06:28:18

标签: python with-statement temporary-files python-internals

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

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

然而,这显然(?)引发了AttributeError: __exit__

使用try-finally明确调用os.close(fd)是一种解决此问题的简单方法,但感觉违反了应该有一个 - 最好只有一个 - 明显的方法来实现它。

有没有办法在tempfile中“解决”这个问题,或者有没有理由说明为什么会以这种方式实施?

2 个答案:

答案 0 :(得分:7)

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

  

本PEP建议由输入()组成的协议       和退出()方法称为"上下文管理协议",       并且实现该协议的对象称为" context       管理者"

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

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

答案 1 :(得分:5)

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

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