все Python 3contextlibпонятие
contextlib.contextmanager
декоратор
Декоратор для создания контекстного менеджера из генераторной функции с yield.
Синтаксис
@contextlib.contextmanager
def my_cm(): ...; yield value; ...
Если внутри блока with вылетит исключение, оно будет возбуждено прямо в точке yield — и код после yield просто не выполнится. Поэтому уборку почти всегда оборачивают в try/finally вокруг yield, иначе ресурс останется незакрытым. Полученный объект одноразовый: генератор исчерпывается после первого with, для второго блока функцию нужно вызвать заново.
Примеры
from contextlib import contextmanager
@contextmanager
def greet(name):
print('enter')
yield f'hi {name}'
print('exit')
with greet('Bob') as msg:
print(msg) # → enter / hi Bob / exit
# Очистка — в finally: выполнится и при исключении внутри with
import os, tempfile
from contextlib import contextmanager
@contextmanager
def tmp_file(name):
path = os.path.join(tempfile.gettempdir(), name)
open(path, 'w').close()
try:
yield path
finally:
os.remove(path)
with tmp_file('demo.txt') as p:
print(os.path.exists(p)) # → True
print(os.path.exists(p)) # → False
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности