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
是完全不合适的,原因有很多:
- 他们并不总是想关闭文件!该上下文管理器专门设计用于有时使文件保持打开状态。这就是编写上下文管理器的全部原因。
- 当他们确实想要关闭文件时,上下文管理器已经这样做了。
- 环绕上下文管理器
closing
会尝试关闭错误的对象。
在您确实总是想关闭文件的情况下,您通常既不需要 closing
也不需要自定义上下文管理器,因为文件已经是上下文管理器。在 with
语句中粘贴一个文件将在最后关闭它而不需要任何特殊的包装器。
在使用 contextlib 定义自定义 "open" 函数以与 with
一起使用的 another answer here 中,来自 contextlib 的 contextmanager
用于定义处理打开和流式传输数据并最终关闭流。
在了解这一点时,我看到还有一个 closing
功能似乎与此类似,特别侧重于完成后关闭流。
我理解 contextmanager
构造是如何工作的(必要时明确关闭流),但我想知道它是否不完整 - 为了正确性(并且是 Pythonic),closing
应该是也参与,或首选?
编辑:我提到的那个答案目前调用 fh.close() - 我想知道是否 closing
应该以某种方式参与这里而不是那样。 contextlib
上的文档首先没有帮助我解决这个非此即彼的问题,因此出现了这个问题。
在那个答案中围绕上下文管理器坚持 contextlib.closing
是完全不合适的,原因有很多:
- 他们并不总是想关闭文件!该上下文管理器专门设计用于有时使文件保持打开状态。这就是编写上下文管理器的全部原因。
- 当他们确实想要关闭文件时,上下文管理器已经这样做了。
- 环绕上下文管理器
closing
会尝试关闭错误的对象。
在您确实总是想关闭文件的情况下,您通常既不需要 closing
也不需要自定义上下文管理器,因为文件已经是上下文管理器。在 with
语句中粘贴一个文件将在最后关闭它而不需要任何特殊的包装器。