12
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

有没有办法让 python在-loop 被中断__exit__时自动调用 context() 的方法?for或者其他实现相同目标的方法?我对生成器和上下文管理器的了解让我怀疑这是不可能的,但这使得上下文管理器在生成器内部相当无用,不是吗?在我看来,块yield内的语句with应该引发红旗,上下文管理器__exit__可能无法运行

4

1 回答 1

18

好吧,您可以使用 try/finally 子句将 yield 包装在 context() 函数中:

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

编辑:如果您尝试 a: help(contextmanager),它将显示它的“典型”使用示例,其中他们使用 try/finally 子句包装 yield。

于 2011-06-01T15:25:27.033 回答