Что такое генераторы контекста (contextlib.contextmanager)?
Генераторы контекста в языке программирования Python представляют собой мощный инструмент для управления ресурсами и упрощения работы с конструкцией with. Одной из самых удобных возможностей стандартной библиотеки является декоратор contextmanager из модуля contextlib, который позволяет превратить обычную функцию-генератор в полноценный менеджер контекста без необходимости создавать отдельный класс с методами enter и exit.
Работа с этим механизмом строится вокруг использования ключевого слова yield, которое логически разделяет выполнение функции на две части. Всё, что находится до yield, выполняется в момент входа в блок with, заменяя метод enter, а всё, что находится после него, выполняется при выходе из блока, заменяя метод exit.
Для обеспечения надежности и корректного освобождения ресурсов настоятельно рекомендуется помещать код очистки в блок finally внутри вашей функции-генератора. Такой подход гарантирует, что даже в случае возникновения исключений внутри блока with ресурсы будут корректно закрыты или возвращены в исходное состояние.
На практике этот инструмент чрезвычайно удобен для реализации различных временных настроек или управления внешними ресурсами, такими как временное изменение рабочей директории, подавление определенных исключений, временное отключение логирования или управление транзакциями в базах данных.