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

ループが中断され__exit__たときに、python が context()のメソッドを自動的に呼び出すようにする方法はありますか? forまたは、同じ目的を達成するための他の方法はありますか? ジェネレーターとコンテキスト マネージャーについて私が知っていることから、それは不可能だと思われますが、これにより、ジェネレーター内でコンテキスト マネージャーが役に立たなくなりますね。私には、ブロックyield内のステートメントwithは赤いフラグを立てる必要があるようです。コンテキストマネージャー__exit__は実行されない可能性があります

4

1 に答える 1

18

そうです、yield in context() 関数を try/finally 句でラップできます。

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)を試すと、yield を try/finally 句でラップする「典型的な」使用例が表示されます。

于 2011-06-01T15:25:27.033 に答える