Что это вообще такое?
Менеджеры контекста - это очередной синтаксический сахар питона. Наверняка любой программист на Python знает вот эту конструкцию для открытия файлов:
Эта конструкция гарантированно закроет ваш файл после завершения блока внутри. with - оператор для открытия менеджера контекста. Без него подобный код выглядел бы вот так:
Отделение блоком кода, в котором открыт файл, естественно, удобно. Заодно исчезает возможность забыть закрыть файл.
Менеджеры контекста довольно просто разрабатывать самостоятельно. Для частых однотипных операций это действительно имеет смысл делать, так как код сразу становится чистым и более читаемым.
На примере кода ниже - функция print_it - это и есть наш менеджер контекста. Ему нужен декоратор contextmanager, а так же yield. Таким образом, у нас появился классический генератор. Сначала выполняются действия до yield, затем управление передается вызывающему блоку кода (телу менеджера контекста), и после его выполнения завершается код после yield. Возвращаемое значение менеджеру контекста, как вы видите, не обязательно.
Теперь мы можем сами реализовать менеджер контекста для открытия файла. Выглядеть он будет достаточно просто:
Примеры из жизни
Рассмотрим несколько фантазий, основанных на реальных примерах. Их реализация не должна вызывать трудностей, главное - хочется донести идею где уместно подобные конструкции использовать.
Самый распространенный сценарий использования менеджеров контекста - это работа с конкурентными данными. Например, взять Lock, который должен быть доступен только одному потоку в единицу времени. Очень наглядно видно какие места в коде будут являться потенциально узкими.
Второй пример из автотестирования - тестовые данные. Внутри может быть, к примеру, код генерации нового клиента для того, чтобы выполнить на нем тест. Другие тесты, выполняясь параллельно, сгенерируют себе новых клиентов.
Третий пример - расширенное логирование на определенном куске кода. Вероятно может быть полезно для отладки. Можно сделать наоборот - выключить логирование определенного кода. Естественно, такое надо делать с осторожностью и понимать потенциальные проблемы такого подхода.
Последний пример снова из автотестирования - selenium speed позволяет управлять скоростью выполнения действий в браузере через selenium во время выполнения автотеста. Некоторые элементы веб-сайтов могут быть плохо приспособлены, к примеру, для очень быстрого ввода текста роботом. Люди ведь не печатают с такой скоростью.
На этом все. С удовольствием расширю список вашими примерами, если они покажутся мне интересными.
Подписывайтесь и следите за новыми статьями.