Python Glossary English

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Сообщить о неточности