从学习python开始:
WITH语句的基本格式如下,其中
方括号中的可选零件:
with expression [as variable]:
with-block
这里的
expression
假定返回支持上下文管理协议(稍后将详细介绍此协议)。
如果存在可选的as子句,此对象还可能返回一个将分配给name
variable
的值。请注意,
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))
不是说前面讲得很有道理,而是说得很清楚。