В моей рабочей среде мы создаем большое количество пакетов Python для внутреннего использования (10 с, если не 100). Каждый пакет имеет некоторые зависимости, как правило, от сочетания внутренних и внешних пакетов, и некоторые из этих зависимостей являются общими.Проверка совместимости API Python
По мере приближения dependency hell, обновления зависимостей становятся трудоемким процессом. Хотя мы заботимся о функциональных изменениях, которые может внести новая версия, равной (если не больше) важности - это изменения API, которые нарушают код.
Несмотря на то, что тесты на совместимость с более новыми версиями зависимостей помогают нам выявить некоторые проблемы, наше покрытие недостаточно близко к 100%, чтобы сделать эту стратегию надежной. Примечания к выпуску и журнал изменений помогают выявить серьезные изменения на высоком уровне, но они редко существуют для встроенных инструментов или достаточно подробно для понимания последствий, которые новая версия имеет для (публичного) API.
Я смотрю на другие пути, чтобы автоматизировать этот процесс.
Я хотел бы иметь возможность автоматически сравнивать две версии пакета Python и сообщать о различиях API между ними. В частности, это будет включать в себя несовместимые изменения, такие как удаление функций/методов/классов/модулей, добавление позиционных аргументов к функции/методу/классу и изменение количества элементов, возвращаемых функцией/методом. Как разработчик, основанный на отчете, который это порождает, я должен иметь более полное представление о последствиях уровня кода, которое изменит эта версия, и поэтому требуется время для ее интеграции.
В другом месте мы используем C++ abi-compliance-checker и смотрим на Java api-compliance-checker, чтобы помочь в этом процессе. Есть ли аналогичный инструмент для Python? Я нашел много инструментов для анализа/анализа/рефакторинга, но ничто из того, что обеспечивает этот уровень функциональности. Я понимаю, что динамическая типизация Python сделает всеобъемлющий отчет невозможным.
Если такой инструмент не существует, являются ли они любыми библиотеками, которые могут помочь в реализации решения? Например, моим нынешним подходом было бы использовать ast.NodeVisitor для перемещения пакета и построения дерева, где каждый узел представляет модуль/класс/метод/функцию, а затем сравнивает это дерево с другим вариантом для того же пакета.
Редактировать: после размещения вопроса я нашел pysdiff, который охватывает некоторые из моих требований, но заинтересован в том, чтобы видеть альтернативы по-прежнему.
Редактировать: также найдено Upstream-Tracker будет хорошим примером такой информации, которую я хотел бы получить.
Этот подход выглядит довольно простым и будет достаточно простым, чтобы распространяться на типы обложек.ClassType и types.MethodType и т. Д. Но я бы предпочел не импортировать проверяемый модуль (я должен был поставить это в исходный вопрос). Я думаю, что статический анализ был бы предпочтительнее, поскольку он упрощает среду выполнения для сравнения (я думаю, pylint работает, например, это, например). –