Python Glossary English

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Сообщить о неточности