【发布时间】:2018-08-13 19:07:41
【问题描述】:
python 内置插件 open 和 file 以我不太了解的方式与上下文管理器一起工作。
据我了解,open 将创建一个file。 file 实现了上下文管理方法 __enter__ 和 __exit__。我最初希望__enter__ 实现文件描述符的实际打开。
但是,在 with 块之外使用 open 将返回一个已打开的 file。因此,似乎file.__init__ 或open 实际上正在打开文件描述符,据我所知file.__enter__ 没有做任何事情。或者file.__init__/open 直接调用file.__enter__?
第一个问题:
open 内置函数的执行流程是什么? open 处理什么,file.__init__ 处理什么,file.__enter__ 处理什么?当重复使用一个file 对象来打开/关闭文件的多个循环时,这是如何工作的?这与为多个上下文循环重用其他上下文管理器对象有何不同?
第二个问题:
file 等对象具有设置步骤和拆卸步骤。设置发生在 __init__ 中,而拆除发生在 close 或 __exit__ 中。
这是一个好的设计模式吗?是否应该为自定义函数/上下文管理器实现此设计模式?
【问题讨论】:
-
Python 是开源的,这意味着您可以通过查看它here 来了解它是如何实现的,并回答您自己的问题。
-
我觉得github.com/python/cpython现在是首选
标签: python file with-statement contextmanager