为什么你可以多次关闭()一个文件对象?

时间:2016-09-20 17:58:20

标签: python

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

我们能找到的唯一与此相关的是here,它只是简单地说(强调我的):

  

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

这似乎是故意设计的,但是,如果你无法在没有例外的情况下对已关闭的文件执行任何操作,我们就无法解决为什么允许多次关闭文件的原因。有用例吗?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

  1. 考虑with是错误的。这种行为一直存在于Python 永远中,因此值得保持它的向后兼容性。

  2. 因为提出异常没有任何意义。如果您的代码中存在实际错误,您可能会在完成使用之前关闭该文件,那么在使用readwrite操作时您将会遇到异常,因此您永远无法触及第二次致电close

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

  4. BDFL以这种方式设计了文件对象,我们一直坚持这种行为,因为没有强有力的改变它。

答案 2 :(得分:0)

函数调用履行了其承诺 - 调用文件后关闭。它不像失败,它只是你没有做任何事情来确保我们要求的条件。