Контекстные менеджеры
Что такое менеджеры контекста, для чего используются?
Менеджеры контекста в Python - это объекты, которые обеспечивают управление контекстом выполнения вокруг блока кода с использованием
ключевого слова with. Они используются для выполнения действий до и после выполнения блока кода, например, для открытия и
закрытия файлов, управления ресурсами или установки и удаления блокировок. Менеджеры контекста позволяют гарантировать правильное
завершение действий, даже в случае возникновения исключения.
Ссылки для изучения
Примеры хороших ответов из реальных собеседований
- Мок-собеседование Middle Python-разработчика · 16:12–16:48Мок-собеседование · Ответ кандидата
Кандидат объясняет контекстный менеджер через гарантированное освобождение ресурсов после операции и приводит файлы и соединения с базой данных.
Что такое методы enter, exit?
Методы __enter__() и __exit__() являются частью протокола менеджера контекста в Python.
Метод __enter__():
-
Этот метод вызывается при входе в блок кода, определенный с использованием ключевого слова
with. -
Он обычно используется для инициализации ресурсов или выполнения каких-либо предварительных действий перед входом в контекст.
Метод __exit__():
-
Этот метод вызывается при выходе из блока кода, определенного с использованием ключевого слова
with. -
Он используется для завершения работы с ресурсами или выполнения каких-либо завершающих действий после выхода из контекста.
-
Метод
__exit__()также обрабатывает исключения, возникающие в блоке кода, и позволяет корректно управлять ресурсами даже при возникновении ошибок.
Ссылки для изучения
Примеры хороших ответов из реальных собеседований
- Python: техническое собеседование Junior-разработчика · 19:30–21:00Мок-собеседование · Совместный разбор
В обсуждении контекстного менеджера названы __enter__ и __exit__; выход из блока закрывает соединение и предотвращает утечку ресурса.
Как создать контекстный менеджер через contextlib.contextmanager?
Функцию-генератор с одним yield декорируют contextlib.contextmanager. Код до yield получает ресурс, значение yield попадает в as, а код после него освобождает ресурс. Очистку помещают в finally, потому что исключение из тела with вбрасывается в генератор на месте yield. Если менеджер не должен подавлять ошибку, ее не поглощают либо поднимают снова. Корректность особенно проверяют на исключении внутри блока, потому что успешный путь не показывает ошибки очистки.
Ссылки для изучения







