这个问题纯粹是出于好奇。在最近的问题讨论中提出 here , 我经常想知道为什么上下文管理器 (with) 不会在人们通过误解显式关闭文件时抛出错误......然后我发现你可以调用 close( ) 在一个文件上多次使用,即使不使用 with 也没有错误。
我们唯一能找到的相关信息是 here它只是温和地说(强调我的):
close( )
Close the file. A closed file cannot be read or written any more. Any operation which requires that the file be open will raise a ValueError after the file has been closed. Calling close() more than once is allowed.
这似乎是有意设计的,但是,如果您不能无一异常(exception)地对关闭的文件执行任何操作,我们就无法弄清楚为什么允许多次关闭文件。有用例吗?
请您参考如下方法:
with的想法是错误的。这种行为一直存在于 Python 中永远,因此为了向后兼容而保留它是值得的。因为引发异常没有任何意义。如果您的代码中存在实际错误,您可能会在使用完文件之前关闭文件,那么无论如何在使用
read或write操作时都会出现异常,并且因此,您永远不会到达对close的第二次调用。允许这样做很少使代码更易于编写,避免添加大量
if not the_file.isclosed(): the_file.close()。BDFL 以这种方式设计文件对象,我们坚持这种行为,因为没有充分的理由改变它。
