对我来说调用tempfile.mkstemp()
最习惯的方式是:
with tempfile.mkstemp() as fd, filename:
pass
然而,这显然引发了AttributeError: __exit__
的问题。
使用try-finally明确调用os.close(fd)
是解决这个问题的简单方法,但感觉违反了“最好只有一种显而易见的做法”的原则。
是否有一种方法可以在tempfile
中“修复”这个问题,或者有没有理由以这种方式实现它?
对我来说调用tempfile.mkstemp()
最习惯的方式是:
with tempfile.mkstemp() as fd, filename:
pass
然而,这显然引发了AttributeError: __exit__
的问题。
使用try-finally明确调用os.close(fd)
是解决这个问题的简单方法,但感觉违反了“最好只有一种显而易见的做法”的原则。
是否有一种方法可以在tempfile
中“修复”这个问题,或者有没有理由以这种方式实现它?
with
语句的作用在PEP 343中定义,包括其所谓的上下文管理协议:
该PEP建议由enter()和exit()方法组成的协议被称为“上下文管理协议”,并且实现该协议的对象被称为“上下文管理器”。
mkstemp
不返回上下文管理器,即不实现__enter__
和__exit__
方法的对象,因此不兼容。tempfile
模块中有其他更适合创建临时文件的方法,例如TemporaryFile()
等。NamedTemporaryFile()
,并给它传入delete=False
参数。