Pythoner
Фотография
✈️Менеджер контекста позволяет выделять и освобождать ресурсы строго по необходимости. В Python за это отвечает блок с оператором with.
[async] with <функция> as <переменная>:
# до и после гарантированно срабатывают события входа в блок with и выхода из него.
__exit__ срабатывает в момент выхода из блока, в том числе по причине возникновения исключения. В этом случае в метод будут переданы exc_class, exc_instance и traceback.
➡️Пример:
with open('file.txt') as f:
data = f.read()
process_data(data)
Файл гарантированно закроется.
➡️Реализация своего контекстного менеджера на основе класса:
class Printable:
def __enter__(self):
print('enter')
def __exit__(self, type, value, traceback):
print('exit')
➡️Реализация своего контекстного менеджера с использованием встроенной библиотеки contextlib:
from contextlib import contextmanager
@contextmanager
def printable():
print('enter')
try:
yield
finally:
print('exit')
💡Контекстные менеджеры также можно использовать для временной замены параметров, переменных окружения, управления транзакциями в БД и других задач, где важен контроль за ресурсами.
🐍 Pythoner
13 · 1.5K ·