Вопрос21
Осталось:

Что такое контекстный менеджер и как работает оператор with?

Образцовый ответ

Показывать ответ по умолчанию

Контекстный менеджер — это объект, который автоматически выполняет действия при входе в блок кода и при выходе из него (даже при возникновении ошибки).

Оператор with:

Самый частый пример — работа с файлами:

# Без with — нужно не забыть закрыть файл
file = open("data.txt", "r")
try:
    content = file.read()
finally:
    file.close()

# С with — файл закрывается автоматически
with open("data.txt", "r") as file:
    content = file.read()
# Файл уже закрыт

Как работает:

  • __enter__() — вызывается при входе в блок with. Возвращаемое значение присваивается переменной после as.
  • __exit__() — вызывается при выходе из блока with, даже если произошло исключение.

Создание своего контекстного менеджера:

class Timer:
    def __enter__(self):
        import time
        self.start = time.time()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        import time
        elapsed = time.time() - self.start
        print(f"Время выполнения: {elapsed:.2f} сек")
        return False  # Не подавлять исключения

with Timer():
    total = sum(range(1_000_000))
# Время выполнения: 0.03 сек

Где используются контекстные менеджеры:

  • Работа с файлами (open)
  • Блокировки в многопоточности (threading.Lock)
  • Подключения к БД (автоматический commit/rollback)
  • Временные ресурсы (временные файлы, сетевые соединения)