Python contextmanager() 与 closing():哪个适用于流对象?

Python contextmanager() vs closing(): which is appropriate for a stream object?

在使用 contextlib 定义自定义 "open" 函数以与 with 一起使用的 another answer here 中,来自 contextlib 的 contextmanager 用于定义处理打开和流式传输数据并最终关闭流。

在了解这一点时,我看到还有一个 closing 功能似乎与此类似,特别侧重于完成后关闭流。

我理解 contextmanager 构造是如何工作的(必要时明确关闭流),但我想知道它是否不完整 - 为了正确性(并且是 Pythonic),closing 应该是也参与,或首选?

编辑:我提到的那个答案目前调用 fh.close() - 我想知道是否 closing 应该以某种方式参与这里而不是那样。 contextlib 上的文档首先没有帮助我解决这个非此即彼的问题,因此出现了这个问题。

在那个答案中围绕上下文管理器坚持 contextlib.closing 是完全不合适的,原因有很多:

  1. 他们并不总是想关闭文件!该上下文管理器专门设计用于有时使文件保持打开状态。这就是编写上下文管理器的全部原因。
  2. 当他们确实想要关闭文件时,上下文管理器已经这样做了。
  3. 环绕上下文管理器 closing 会尝试关闭错误的对象。

在您确实总是想关闭文件的情况下,您通常既不需要 closing 也不需要自定义上下文管理器,因为文件已经是上下文管理器。在 with 语句中粘贴一个文件将在最后关闭它而不需要任何特殊的包装器。