3

假设我有一个上下文管理器:

@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产量?

4

1 回答 1

4

@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()最后一次调用它。

于 2013-05-15T21:39:36.377 回答