假设我有一个上下文管理器:
@contextmanager
def cm(x):
y = f(x)
z = yield y
g(z)
如何将
z
发送到上下文管理器?我试过了:
my_cm = cm()
with my_cm:
my_cm.gen.send(123)
但我得到StopIteration,这可能是因为
send
产生了吗? 最佳答案
@contextmanager
返回一个辅助函数,该函数又返回一个GeneratorContextManager
实例,该实例将生成器用作管理上下文的一种方式。
不能将其用作可发送给的任何内容,在next()
中称为__enter__
。您可以尝试使用.gen
属性访问基础生成器:
my_cm.gen.send(123)
但是您必须包含一个额外的yield语句,以防止该方法过早退出。请注意,
__exit__
将再次调用next()
以结束生成器。@contextmanager
def cm(x):
y = f(x)
a = yield y # Run for `__enter__`, returning `y`; `.send()` resumes here
yield # Here we pause again
g(a)
之所以起作用,是因为它有第二个
yield
再次暂停生成器,直到上下文管理器准备好最后一次调用next()
为止。