Декоратор, упрощающий создание менеджеров контекста.
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
На заметку
У нас есть новостная группа в Telegram. Там же можно обсудить интересующие вопросы. Ссылка в самом низу страницы.