Что такое monkey patching в Python

Ответ

Monkey patching — это техника динамического изменения (замены) атрибутов или методов классов и модулей во время выполнения программы. Это позволяет модифицировать поведение стороннего кода без изменения его исходников.

Этот подход является мощным, но рискованным, так как может приводить к трудноотлавливаемым ошибкам и несовместимости при обновлении библиотек.

Основные сценарии использования:

  • Тестирование: Замена внешних зависимостей (например, сетевых запросов или работы с базой данных) на mock-объекты. Библиотека unittest.mock.patch активно использует этот механизм.
  • Исправление багов: Временное исправление ошибок в сторонней библиотеке до выхода официального патча.
  • Добавление функциональности: Расширение возможностей существующего класса.

Пример:

import datetime

# Сохраняем оригинальный метод
_original_datetime_now = datetime.datetime.now

def patched_now():
    # Всегда возвращаем фиксированную дату
    return datetime.datetime(2023, 1, 1, 12, 0, 0)

# Применяем monkey patch
datetime.datetime.now = patched_now

# Теперь любой вызов datetime.datetime.now() вернет нашу дату
print(f"Текущее время после патча: {datetime.datetime.now()}")
# Вывод: Текущее время после патча: 2023-01-01 12:00:00

# Возвращаем оригинальное поведение (важно для чистоты кода)
datetime.datetime.now = _original_datetime_now