from contextlib import contextmanager
@contextmanager
def context():
print "entering"
yield
print "exiting"
def test():
with context():
for x in range(10):
yield x
for x in test():
if x == 5:
break # or raise
输出:
entering
当__exit__
- 循环中断时,有没有办法让python自动调用context {的for
方法?或者其他一些实现相同目标的方式?我对生成器和上下文管理器的了解让我怀疑它是不可能的,但是这使得上下文管理器在内部生成器中相当无用,不是吗?在我看来,yield
块中的with
语句应该会引发一个红旗,上下文管理器__exit__
可能无法运行。
答案 0 :(得分:16)
好吧,您可以使用try / finally子句包装context()函数中的yield:
from contextlib import contextmanager
@contextmanager
def context():
print "entering"
try:
yield
finally:
print "exiting"
def test():
with context():
for x in range(10):
yield x
for x in test():
if x == 5:
break # or raise
输出:
entering
exiting
编辑:如果您尝试: help(contextmanager),它将显示它的“典型”用法示例,其中使用try / finally子句包装yield。