contextlib.nested
Позволяет вложить несколько менеджеров один в другой.
contextlib.nested(*managers)
*managers -- Менеджеры контекста, которые следует вложить один в другой.
Внимание
Функция устарела, воспользуйтесь встроенными возможностями with.
from contextlib import nested, contextmanager
@contextmanager
def manager_one():
print('one start')
yield
print('one finish')
@contextmanager
def manager_two():
print('two start')
yield
print('two finish')
with nested(manager_one(), manager_two()): # one start \n two start
print('do') # do
# two finish
# one finish
На заметку
Причины устаревания. 1. Менеджеры создаются до начала работы этой функции, а потому происходящее в
__new__()
и __init__() нижестоящих менеджеров не управляется стоящими выше. В результате, если, скажем, открыть при помощи nested()
два файла, то при ошибке открытия второго первый не будет закрыт вовсе. 2. Если в __enter__() нижестоящего менеджера возбуждается исключение, заглушаемое потом в __exit__() вышестоящего, то это выливается в RuntimeError, а не в ожидаемый пропуск тела инструкции with
.
Синонимы поиска: contextlib.nested, contextlib, nested
На заметку
Зарегистрированные пользователи могут добавлять Видео.