python - 发送到使用 contextlib.contextmanager 定义的上下文管理器

标签 python python-3.x generator contextmanager

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

@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/

相关文章:

python - 如何根据垂直位置重命名 python 列表列表中的重复元素?

python - itertools.ifilter 与 IPython 并行

javascript - 我怎样才能用javascript制作一个简单的wep key 生成器?

parsing - ANTLR 是序列化/反序列化二进制数据格式的合适工具吗?

python - 如何从列表中过滤项目并将它们存储在另一个列表中?

java - 在 java 代码 (runtime.exec) 中调用 python 脚本

python - Pandas:选择连续的行,其中所选范围中的第一行和最后一行形成一个表达式

python - Django "ValueErrror: could not find common ancestor of {migrations}"

python - 有没有办法在每一行中打印一个字典的键和值?

python - API 使用 Falcon 框架调用另一个 API