在生成器中使用上下文管理器是否有意义的方法?

时间:2011-06-01 15:00:49

标签: python generator contextmanager

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__可能无法运行

1 个答案:

答案 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。