Вопрос №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)
- Временные ресурсы (временные файлы, сетевые соединения)
