Python 3.3+contextlibпонятие
contextlib.ExitStack
динамический
Позволяет динамически регистрировать произвольное число контекстных менеджеров и колбэков.
Синтаксис
with contextlib.ExitStack() as stack:
cm = stack.enter_context(some_cm())
Берите его, когда число менеджеров известно только в рантайме или часть из них подключается по условию; для фиксированного набора обычный with с перечислением через запятую читается лучше. Выход происходит в обратном порядке регистрации, как у вложенных with. Метод pop_all() снимает всё со стека, не закрывая, — так передают владение ресурсами наружу, когда инициализация прошла успешно.
Примеры
from contextlib import ExitStack
files = ['a.txt', 'b.txt']
with ExitStack() as stack:
fds = [stack.enter_context(open(f, 'w')) for f in files]
# все файлы закроются при выходе
stack2 = ExitStack()
stack2.callback(print, 'done')
stack2.close() # → done
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности