我有以下代码来说明我在哪里使用ExitStack而不是with语句
from contextlib import contextmanager
from contextlib import ExitStack
from tempfile import NamedTemporaryFile
@contextmanager
def myfile():
temp_file = NamedTemporaryFile(suffix='.txt')
temp_file.seek(0)
yield temp_file
os.unlink(temp_file.name)
with ExitStack() as stack:
files = []
for idx in range(5):
files.append(stack.enter_context(myfile()))
# do something with the files
上面的代码给出了5条错误消息,如下所示
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/tmpbupwinzt.txt'
我是否以错误的方式使用ExitStack。做上述事情的正确方法是什么
注意:我不能更改myfile()
函数,但我可以更改其余代码
我想我找到了一个解释。从docs开始:
但是,您正在取消程序中文件的链接(第
myfile
行的最后一行)。当测试程序结束时,垃圾收集无法关闭和取消文件链接,并打印错误。换句话说,错误不会发生在with
语句中一个简单的解决方案是禁用自动删除:
但是,我认为新文件上的
seek(0)
是不必要的,整个myfile
不做NamedTemporaryFile
还没有做的事情,因此您可以直接使用它:相关问题 更多 >
编程相关推荐