Python 3.2+contextlibпонятие
contextlib.ContextDecorator
менеджеры
Базовый класс, позволяющий использовать контекстный менеджер ещё и как декоратор функции (@cm).
Синтаксис
class C(contextlib.ContextDecorator): ...
Смысл в том, чтобы не оборачивать всё тело функции в with ради одного и того же менеджера — но у формы @cm нет способа получить значение, которое менеджер отдаёт через as, поэтому она годится только для менеджеров, работающих ради побочного эффекта. Базовый _recreate_cm() возвращает тот же самый объект, так что одноразовый менеджер после первого вызова функции сломается: его нужно переопределить (у @contextmanager это уже сделано — генератор создаётся заново на каждый вызов).
Примеры
import contextlib
print(hasattr(contextlib.ContextDecorator, '_recreate_cm')) # → True
print('__call__' in vars(contextlib.ContextDecorator)) # → True
print(callable(contextlib.ContextDecorator())) # → True
print(hasattr(contextlib.ContextDecorator, '__enter__'), hasattr(contextlib.ContextDecorator, '__exit__')) # → False False
gen_cm = contextlib.contextmanager(lambda: iter([None]))
print(isinstance(gen_cm(), contextlib.ContextDecorator)) # → True
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности