contextlib.ContextDecorator
Базовый класс для менеджеров контекста, которые могут быть использованы в качестве декораторов.
На заметку
+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
На заметку
В разделе «События» можно узнать о надвигающихся событиях мира Python, а также поделиться своими. Если вы являетесь организатором встречи/конференции/спринта, зарегистрируйте это событие в указанном разделе, чтобы о нём узнали все желающие.