为什么可以多次 close() 文件对象?

rog*_*osh 2 python

这个问题纯粹是出于好奇。在最近的一个问题讨论中我经常想知道为什么with当人们通过误解显式关闭文件时上下文管理器()不会抛出错误......然后我发现你可以调用close()文件即使不使用多次也没有错误with

我们能找到的唯一与此相关的东西是这里,它只是温和地说(强调我的):

close( )
关闭文件。关闭的文件无法再读取或写入。任何需要打开文件的操作都会在文件关闭后引发 ValueError。允许多次调用 close()

这似乎是有意设计的,但是,如果您无法无一例外地对关闭的文件执行任何操作,我们无法弄清楚为什么允许多次关闭文件。有使用案例吗?

mgi*_*son 6

资源管理是一件大事。这是我们首先拥有上下文管理器的部分原因。

猜测核心开发团队认为最好让多次调用 close 变得“安全”,以鼓励人们关闭他们的文件。否则,您可能会陷入这样的境地:“这之前关闭过吗?”。如果.close()无法多次调用,唯一的选择是将调用放在/子句file.close()中。这使得代码变得更丑陋,并且(坦率地说),很多人可能只是删除对的调用,而不是正确处理它。在这种情况下,能够方便地调用而不必担心任何后果,因为它几乎肯定会成功,并给您留下一个您知道之后会关闭的文件。tryexceptfile.close()file.close()


Bak*_*riu 6

  1. 想想with就错了。这种行为在 Python 中一直存在,因此值得保留它以实现向后兼容性。

  2. 因为提出例外是没有任何意义的。read如果您的代码中存在实际错误,您可能会在使用完文件之前关闭该文件,那么无论如何使用or操作时都会出现异常write,因此您永远不会到达对close.

  3. 允许这样做很少会使代码更容易编写,避免添加大量if not the_file.isclosed(): the_file.close().

  4. BDFL 以这种方式设计文件对象,我们一直坚持这种行为,因为没有充分的理由来改变它。