从学习python开始:
WITH语句的基本格式如下,其中
方括号中的可选零件:

with expression [as variable]:
    with-block

这里的expression假定返回支持
上下文管理协议(稍后将详细介绍此协议)。
如果存在可选的as子句,此对象还可能返回一个将分配给namevariable的值。
请注意,variable不一定指定
expression的结果是
支持上下文协议,并且可以分配expression
语句中要使用的其他内容。
variable被计算为上下文管理器对象。
分配给什么?引号只说明它不是上下文管理器对象。
分配到expression是否调用上下文管理器类的某个方法以生成分配给variable的实际值?
谢谢。

最佳答案

__enter__返回的内容。从documentation on the __enter__ method of context managers开始:
contextmanager.__enter__()
输入运行时上下文并返回此对象或与运行时上下文相关的其他对象。此方法返回的值使用此上下文管理器绑定到as语句的with子句中的标识符。
(强调我的)
调用__enter__的结果很可能是一个上下文管理器,规范中没有禁止这样做的内容。当然,它可以是另一个与运行时上下文相关的对象,如docs状态。
__enter__返回自身的对象可以反复用作上下文管理器。file objects,例如:

with open('test_file') as f1:   # file.__enter__ returns self
    with f1 as f2:                # use it again, get __self__ back
        print("Super context managing")
        with f2 as f3, f1 as f4:   # getting weird.
            print("This can go on since f1.__enter__ returns f1")
        print("f1.__exit__ has been called here, though :)")
        print("f1 closed: {}".format(f1.closed))

不是说前面讲得很有道理,而是说得很清楚。

08-04 09:21