如何使用“with”调用tempfile.mkstemp()?或者为什么它没有在__exit__()中返回fd?(涉及IT技术)

12

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

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

然而,这显然引发了AttributeError: __exit__的问题。

使用try-finally明确调用os.close(fd)是解决这个问题的简单方法,但感觉违反了“最好只有一种显而易见的做法”的原则。

是否有一种方法可以在tempfile中“修复”这个问题,或者有没有理由以这种方式实现它?


6
谢谢你的负评,请评论如何改进问题。 - Kimvais
2个回答

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

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

mkstemp不返回上下文管理器,即不实现__enter____exit__方法的对象,因此不兼容。
一个明显的解决方法是创建一个实现上下文管理协议的包装类。

5
tempfile模块中有其他更适合创建临时文件的方法,例如TemporaryFile()等。
特别是,如果您不希望文件被删除,请使用NamedTemporaryFile(),并给它传入delete=False参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接