Базовый класс для менеджеров контекста, которые могут быть использованы в качестве декораторов.

На заметку
+py3.2 contextmanager() наследуется от этого класса, то есть, его можно использовать в качестве декоратора.

Менеджеры контекста, унаследованные от данного класса, также как и обычные менеджеры контекста должны реализовывать методы __enter__() и __exit__(). В __exit__ можно [как и раньше] управлять исключениями, и это будет учтено при работе в качестве декоратора.

Очевидно, что в случае декоратора возможность получения результата __enter__ отсутствует. Если это нужно, используйте with.

Кроме прочего, имеется возможность использования данного класса в виде примеси, как это сделано в примере ниже.

    from contextlib import ContextDecorator


class ContextBase:

def __enter__(self):
print('enter')
return self

def __exit__(self, *exc):
print('exit')
return False


class my_context_decorator(ContextBase, ContextDecorator):

def __init__(self):
print('init')


@my_context_decorator()
def print_do():
print('do')


print_do()
# init
# enter
# do
# exit


with my_context_decorator(): # init enter
print('some') # some
#exit

Внимание
Поскольку декорируемая функция должна поддерживать вызов некоторое количество раз, используемый ею менеджер контекста, должен также поддерживать использование в нескольких инструкциях with. Если он не может этого гарантировать, то следует использовать не декоратор, а функцию с with в теле.
Синонимы поиска: contextlib.ContextDecorator, contextlib, ContextDecorator
На заметку
Зарегистрированные пользователи могут получать еженедельный дайджест обновлений на сайте.