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

Kim*_*ais 11 python with-statement temporary-files python-internals

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

with tempfile.mkstemp() as fd, filename:
    pass
Run Code Online (Sandbox Code Playgroud)

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

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

有没有办法"修复"这个tempfile或者有没有理由说明为什么这样实现?

Hen*_*rik 7

with声明的工作原理在PEP 343中定义,包括其所谓的上下文管理协议:

该PEP建议将由enter()和exit()方法组成的协议称为"上下文管理协议",并且实现该协议的对象称为"上下文管理器".

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

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


glg*_*lgl 5

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

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