Python Glossary English

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