Для чего нужен monkey patching?
Что проверяют
Понимаете ли вы, что это приём последней надежды, и знаете ли легальные случаи его применения.
Как отвечать
Обезьяний патч это подмена атрибутов, функций или методов у чужого модуля или класса во время выполнения. Возможно это потому, что в Python классы и модули изменяемы.
Где применяется по делу:
- тесты: подмена времени, случайных чисел, сетевых вызовов. Это самый частый и законный случай, и делается он не руками, а через
unittest.mock.patchили фикстуруmonkeypatchв pytest, которые сами возвращают всё обратно; - срочное исправление чужой библиотеки: баг найден, исправление в апстриме будет через месяц, а работать надо сейчас. Патч делают локально, с комментарием и ссылкой на issue, и снимают после обновления;
- инструментирование: библиотеки трассировки и сбора метрик оборачивают функции клиентов баз данных и HTTP, чтобы измерять вызовы без правки кода приложения;
- адаптация к среде: gevent подменяет стандартные блокирующие модули на неблокирующие аналоги.
Обязательно назовите цену: патч действует глобально на весь процесс, поэтому ломает всех пользователей библиотеки; он невидим в месте использования, и следующий разработчик потратит часы, выясняя, почему функция ведёт себя не как в документации; при обновлении библиотеки патч тихо перестаёт работать или ломает её.
Отсюда правило: в тестах через штатные инструменты, в продакшене только как временная мера с комментарием, а альтернативы (наследование, обёртка, форк, внедрение зависимости) всегда предпочтительнее.
Где спотыкаются
Патчат в продакшене «чтобы быстрее» и оставляют это на годы.
Забывают отменить подмену в тестах и получают влияние одного теста на другой.
Патчат не там: patch должен указывать на место использования, а не на место определения, иначе подмена не сработает.