Python的contextlib提供了将生成器转换为上下文管理器的包装器:
from contextlib import contextmanager
@contextmanager
def gen():
yield
with gen() as cm:
...
生成器提供了向刚刚产生值的生成器发送值的功能:
def gen():
x = yield
print(x)
g = gen()
next(g)
g.send(1234) # prints 1234 and raises a StopIteration because we have only 1 yield
有没有办法同时获取这两种行为?我希望将一个值传递到我的上下文管理器中,以便在处理__exit__
时使用。所以类似这样:
from contextlib import contextmanager
@contextmanager
def gen():
x = yield
# do something with x
with gen() as cm:
# generator already yielded from __enter__, so we can send
something.send(1234)
我不确定这是否是一个好的/合理的想法。 我觉得它会破坏一些抽象层,因为我会假设上下文管理器是作为包装的生成器实现的。 如果这是可行的想法,我不确定
something 应该是什么。