Рубрики
Разработчикам

Создание объектов, поддерживающих выраже…

Создание объектов, поддерживающих выражение with
#Python

Все знают о том, как, например, открыть файл, или, возможно, как установить блокировку с использованием оператора with. Но можно ли самостоятельно реализовать механизм управления блокировками? Да, это вполне реально. Протокол управления контекстом исполнения реализуется с использованием методов enter и exit:

class Connection:
 def __init__(self):
 …

 def __enter__(self):
 # Инициализируем соединение…

 def __exit__(self, type, value, traceback):
 # Закрываем соединение…

with Connection() as c:
 # __enter__() executes
 …
 # conn.__exit__() executes

Это — наиболее распространённый способ реализации возможностей менеджера контекста в Python, но то же самое можно сделать и проще:

from contextlib import contextmanager

@contextmanager
def tag(name):
 print(f»»)
 yield
 print(f»»)

with tag(«h1»):
 print(«This is Title.»)

Здесь протокол управления контекстом реализован с использованием декоратора contextmanager. Первая часть функции tag (до yield) выполняется при входе в блок with. Затем выполняется сам этот блок, а после этого выполняется оставшаяся часть функции tag.