Основной вариант использования класса contextlib.ExitStack()
- это тот, который приведен в документации: поддержка переменного числа менеджеров контекста и других операций очистки в одном операторе with
.
Переменное количество контекстных менеджеров может быть необходима для управления пользовательским вводом, таким как открытие коллекции файлов заданных пользователем или из-за того, что некоторые из менеджеров контекста являются необязательными:
with ExitStack() as stack: for resource in resources: stack.enter_context(resource) if need_special_resource(): special = acquire_special_resource() stack.callback(release_special_resource, special) # выполнение операции, которые используют полученные ресурсы
Как показано в примере, contextlib.ExitStack()
делает это довольно простым в использовании с операторами для управления произвольными ресурсами, которые изначально не поддерживают протокол управления контекстом.