Грэм Дэмплтон — автор wrapt, mod_wsgi и Python-агента New Relic — выпустил Wrapture. Библиотека позволяет обернуть любую функцию или метод так, чтобы отслеживать все вызовы, перехватывать аргументы и подменять возвращаемые значения — без изменения исходного кода. Проекту несколько недель, но уже есть полная документация, тесты и отдельный пост о паттернах тестирования.
Контекст
Wrapt — одна из самых уважаемых Python-библиотек для декораторов и monkey-patching. Дэмплтон годами работал над инструментами наблюдаемости: Python-агент New Relic, mod_wsgi для Apache — всё это инфраструктура, которая позволяет смотреть внутрь чужого кода, не трогая его. Wrapture продолжает ту же идею, но объединяет трассировку и тестирование в одном интерфейсе.
Ключевая проблема, которую решает библиотека: как наблюдать за кодом, которым ты не управляешь, не нарушая его поведения. Нужно добавить трассировку в legacy-сервис без рефакторинга? Написать тест с перехватом вызова стороннего API без громоздкого unittest.mock? Wrapture предлагает единый интерфейс для обоих сценариев.
«Присоединять наблюдение к коду, которым ты не управляешь, записывать то, что через него проходит, и делать это, не тревожа наблюдаемую программу — это проблема, о которой я никогда не переставал думать.»
Библиотека поддерживает OpenTelemetry и включает конфигурационный режим трейсинга: добавить наблюдаемость в существующий Python-проект можно через TOML-подобный конфиг, вообще не меняя исходный код. Это редкость среди инструментов такого класса.
Аналитика
Здесь два сюжета. Первый — сама библиотека. Альтернатива unittest.mock давно назревала: стандартный mock громоздкий, плохо читается и требует знания внутренностей того, что мокируешь. Wrapture предлагает wrapture.binding(Gateway, "charge").on_call.returns({...}) — синтаксис, который читается почти как спецификация. Плюс паттерн transforms_result: вызвать реальный метод и затем модифицировать его ответ — без полного мока и без потери покрытия.
Второй сюжет важнее для индустрии в целом. Дэмплтон прямо заявляет, что каждая строка Wrapture написана ИИ-ассистентом — и тут же проводит жёсткую границу: это не вайб-кодинг. Вайб-кодинг — когда промт генерирует кучу кода, а человек надеется на лучшее, потому что не может оценить результат. Здесь иначе: автор десятилетиями работал в этом углу Python и точно знал, каким должен быть результат. ИИ — инструмент производства, а не источник дизайна.
Это разделение становится центральным для понимания следующего этапа разработки ПО. Экспертиза не исчезает — она перемещается с написания кода на архитектуру, требования и верификацию. Wrapture — ранний, но убедительный пример того, как это выглядит на практике в серьёзном инструментарии, а не в учебных экспериментах.
Кейсы применения в бизнесе
B2B SaaS стартап. Команда интегрирует платёжный провайдер. Тестировать реальные вызовы дорого и ненадёжно. Wrapture позволяет заменить Gateway.charge() на заглушку с предсказуемым ответом — одной конструкцией — и дополнительно верифицировать трансформацию данных через transforms_result. Тесты становятся точнее, не зависят от внешней системы, читаются как документация.
Корпорация с legacy-кодом. Есть production Python-сервис без трассировки. Переписывать нельзя — слишком рискованно. Конфигурационный режим Wrapture позволяет добавить OpenTelemetry-трейсинг через конфиг-файл без единого изменения в исходном коде. Spans и метрики начинают поступать в любой OTEL-совместимый бэкенд, не трогая бизнес-логику.
Небольшая команда в КР или СНГ. Поддерживаете интеграцию с локальным API или сторонним сервисом. Добавить наблюдаемость с нуля — задача на недели. Конфигурационный трейсинг Wrapture снижает порог входа: описываете целевые функции в конфиге, подключаете sink, получаете трассировку без погружения в архитектуру чужого кода.
Кейсы в личной жизни
Разработчик, пишущий тесты. Если вы регулярно используете unittest.mock.patch и устали от verbose-синтаксиса — Wrapture прямая альтернатива. Паттерн with wrapture.binding(Class, "method").on_call.returns(value): компактнее и читается без расшифровки. Попробуйте переписать один тестовый файл: сразу будет понятно, подходит ли вам.
Python-разработчик на фрилансе. Добавление трейсинга в чужой проект — частая задача при аудите или консалтинге. Конфигурационный подход Wrapture означает, что можно продемонстрировать наблюдаемость заказчику за один рабочий день, не погружаясь глубоко в архитектуру его кода.
Студент или джун. Wrapture — хороший учебный пример того, как устроены monkey-patching, декораторы и перехват вызовов в Python. Исходный код написан при участии ИИ, но спроектирован экспертом — архитектура читаемая и осмысленная, не генерированный хаос. И мета-история разработки тоже полезна: смотреть, как эксперт ставит задачи ИИ-ассистенту.
Как применить сегодня
- Установите Wrapture через pip и пройдитесь по официальной документации — она подробная и структурированная.
- Найдите в своём проекте один тест с
unittest.mock.patchи перепишите его черезwrapture.binding(): сравните читаемость и объём кода. - Если есть legacy Python-сервис без трассировки — попробуйте конфигурационный режим: опишите целевые функции и подключите OTEL-sink в конфиге, не меняя исходный код.
- Изучите паттерн
transforms_result: он позволяет вызвать реальный метод и модифицировать его ответ — удобно для тестирования трансформаций данных от внешних API. - Прочитайте пост Дэмплтона о разработке через ИИ — он поднимает конкретный вопрос о том, где граница между экспертным agent-driven подходом и вайб-кодингом, и как выглядит первый на практике.
