Объединение с оператором и цикл for в Python - PullRequest
0 голосов
/ 26 октября 2019

Рассмотрим следующий код Python, который использует менеджер контекста для получения и освобождения ресурса:

from contextlib import contextmanager

@contextmanager
def res(i):
    print(f'Opening resource {i}')
    yield
    print(f'Closing resource {i}')

Теперь предположим, что нам нужно использовать пару из этих ресурсов

with res(0), res(1), res(2):
    print('Using resources.')

где внутренняя часть зависит от всех трех ресурсов, открытых одновременно. После выполнения приведенного выше кода мы получим ожидаемый результат:

Opening resource 0
Opening resource 1
Opening resource 2
Using resources.
Closing resource 2
Closing resource 1
Closing resource 0

Если вам нужно использовать еще больше ресурсов - res(0) ... res(10) можно ли динамически генерировать, используя цикл for, эквивалентный псевдокоду ниже?

with res(0), res(1), ... , res(10):
    print('Using resources.')

1 Ответ

2 голосов
/ 26 октября 2019

Это то, для чего contextlib.ExitStack.

with ExitStack() as es:
    for x in range(10):
        es.enter_context(res(x))

Каждый менеджер контекста в стеке будет выходить в обратном порядке, в котором он был введен после выполнения оператора with.

...