对我而言,调用tempfile.mkstemp()
的最惯用方式是:
with tempfile.mkstemp() as fd, filename:
pass
然而,这显然(?)引发了AttributeError: __exit__
使用try-finally明确调用os.close(fd)
是一种解决此问题的简单方法,但感觉违反了应该有一个 - 最好只有一个 - 明显的方法来实现它。
有没有办法在tempfile
中“解决”这个问题,或者有没有理由说明为什么会以这种方式实施?
答案 0 :(得分:7)
with
语句的工作方式在PEP 343中定义,包括其所谓的上下文管理协议:
本PEP建议由输入()组成的协议 和退出()方法称为"上下文管理协议", 并且实现该协议的对象称为" context 管理者"
mkstemp
不返回上下文管理器,这是一个实现__enter__
和__exit__
方法的对象,因此不兼容。
一个明显的解决方法是创建一个实现上下文管理器协议的包装类。
答案 1 :(得分:5)
在tempfile
模块中,还有其他更适合创建临时文件的方法,例如TemporaryFile()
和其他文件。
特别是,如果您不想删除该文件,请使用NamedTemporaryFile()
,为其提供delete=False
参数。