contextlib.contextmanager
Декоратор, упрощающий создание менеджеров контекста.
contextlib.contextmanager(func)
-> callable
func -- Функция-генератор, которую требуется представить в качестве менеджера контекста. Генератор должен производить ровно одно значение.
Этот декоратор позволяет представить функцию-генератор в виде менеджера контекста, который можно будет использовать с инструкцией with и при этом не будет необходимости описания отдельного класса с методами __enter__() и __exit__().
Рассмотрим два пути создания равноценных менеджеров контекста:
После выработки (
По окончании исполнения тела, управление возвращается генератору.
В случае исключения в теле, оно будет подниматься в точке с инструкцией
Рассмотрим два пути создания равноценных менеджеров контекста:
from contextlib import contextmanager
class MyContextManager(object):
def __enter__(self):
print('enter')
def __exit__(self, exc_type, exc_value, traceback):
print('exit')
@contextmanager
def my_context_manager():
print('enter')
yield
print('exit')
with MyContextManager(): # enter
print('do') # do
# exit
with my_context_manager(): # enter
print('do') # do
# exit
После выработки (
yield
) генератором значения, выполняется тело инструкции with
. По окончании исполнения тела, управление возвращается генератору.
В случае исключения в теле, оно будет подниматься в точке с инструкцией
yield
, что даёт возможность использования try except finally для обработки ошибок и/или финализации: @contextmanager
def my_context_manager():
try:
yield
except:
# Если исключение не планируется подавить, то его нужно поднять снова.
raise
finally:
print('финализируем')
Синонимы поиска: contextlib.contextmanager, contextlib, contextmanager
На заметку
В соответствующем разделе вы можете зарегистрировать сообщество по интересам, чтобы о нём узнали и другие посетители сайта — возможно, так вы отыщите новых единомышленников и друзей.. И не важно виртуальное оно, или вполне реальное, давно существующее, или только-только придуманное.