Show HN: Modshim – A new alternative to monkey-patching in Python
Инструмент modshim позволяет переопределять и настраивать Python-пакеты без изменения их исходного кода. Это решение даёт возможность вносить изменения в зависимости, исправлять ошибки или добавлять функциональность без создания форка проекта. Подобные инструменты часто используют техники перехвата импорта или патчирования модулей во время выполнения.
Проект может быть особенно полезен для разработчиков, которым нужно быстро внести небольшие изменения в сторонние библиотеки, но у них нет возможности или желания изменять исходный код. Это упрощает управление зависимостями и ускоряет разработку, позволяя избежать сложного процесса создания и поддержки форков.
Комментарии (22)
- Пользователи обсуждают инструмент для monkey-patching в Python, который использует временный импорт-хук для обхода импортов и позволяет документировать код в стиле literate-code.
- Некоторые участники отмечают, что такой подход может быть неудобен при работе с внешними зависимостями, особенно если они часто обновляются, и что это может привести к необходимости поддерживать форк.
- Участники также обсуждают, что вместо использования такого инструмента, можно было бы просто форкнуть библиотеку и внести изменения, что может быть более устойчивым решением в долгосрочной перспективе.
- Также поднимается вопрос о том, что если библиотека, которую вы хотите изменить, имеет сложную систему импортов и экспортов, то такой инструмент может не справиться с этим.
- В конце обсуждение сместилось в сторону обсуждения того, что если вы контролируете все импорты, то вы можете просто сделать сабкласс или обвернуть нужные части библиотеки, что может быть более питоничным способом решения проблемы.
Dynamically patch a Python function's source code at runtime
Как заменить код функции «на лету»
Python позволяет переписывать тело функции во время работы программы:
-
Берём исходник новой функции как строку.
new_src = "def f(x): return x * 2" -
Компилируем:
code = compile(new_src, "<magic>", "exec") -
Выполняем в нужном пространстве имён:
ns = {} exec(code, {}, ns) -
Подменяем старую функцию:
f = ns["f"]
f(21) теперь возвращает 42.
Зачем это нужно
Такой трюк позволяет LLM-агентам генерировать и сразу запускать код с доступом к текущему контексту. Это удобно для ToolBot, но открывает огромную дыру в безопасности: любой сгенерированный код получает доступ ко всем переменным процесса.
Комментарии (69)
- @breuleux показал jurigged — библиотеку для горячей перезагрузки только изменённых функций без перезапуска модулей.
- Участники сравнили приём с monkey-patching, Lisp-овой «код как данные» и REPL, отметив плюсы и отладочные грабли (стек-трейсы вида
<magic>). - Обсуждали, где ещё работает такое: JVM/CLR, Erlang, динамические библиотеки в C/C++ и игровые движки.
- Кто-то считает это мощным, кто-то — анти-паттерном; всплыли ссылки на autoreload, forge и swanky-python.
- Наконец, всех достала навязчивая привязка любой темы к AI-хайпу.