Есть ли эффективный способ использования диспетчеров контекста внутри генераторов?

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

output:

entering

Есть ли способ сделать python автоматически вызывает метод __ exit __ в context (), когда цикл for прерывается? Или каким-то другим способом достичь той же цели? То, что я знаю о генераторах и менеджерах контекста, заставляет меня подозревать, что это невозможно, но это делает менеджеры контекста бесполезными внутри генераторов, не так ли? Мне кажется, что оператор yield внутри блока с должен вызвать красный флаг, диспетчер контекста __ exit __ может не работать . . 11142699]

10
задан Андрей Беньковский 9 December 2015 в 13:32
поделиться