假设我有一个上下文管理器:
@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()
。
关于python - 发送到使用 contextlib.contextmanager 定义的上下文管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16575316/