Иногда нужно выполнить блок кода с несколькими менеджерами контекста:
with open('f') as f:
with open('g') as g:
with open('h') as h:
pass
Начиная с Python 2.7 и 3.1, это можно записать в одной конструкции
with
:
o = open
with o('f') as f, o('g') as g, o('h') as h:
pass
Раньше для этого использовали функцию
contextlib.nested
:
with nested(o('f'), o('g'), o('h')) as (f, g, h):
pass
Если же число менеджеров контекста заранее неизвестно, лучше подойдёт более продвинутый инструмент.
contextlib.ExitStack
позволяет открывать любое число контекстов в произвольный момент, но гарантирует корректный выход из них в конце:
with ExitStack() as stack:
f = stack.enter_context(o('f'))
g = stack.enter_context(o('g'))
other = [
stack.enter_context(o(filename))
for filename in filenames
]
👉@BookPython
>>Click here to continue<<