Как вы можете найти неиспользуемые функции в коде Python?
Итак, у вас есть какой-то старый код, лежащий в довольно здоровом проекте. Как вы можете найти и удалить мертвые функции?
Я видел эти две ссылки: Найти неиспользуемый код и Инструмент для поиска неиспользуемых функций в php-проекте, но они кажутся специфичными для С# и PHP соответственно.
Есть ли инструмент Python, который поможет вам найти функции, которые не упоминаются нигде в исходном коде (несмотря на отражение/и т.д.)?
Ответы
Ответ 1
В python вы можете найти неиспользуемый код с помощью динамических или статических анализаторов кода. Два примера для динамических анализаторов - coverage
и figleaf
. У них есть недостаток, что вы должны запускать все возможные ветки вашего кода, чтобы найти неиспользуемые части, но они также имеют то преимущество, что вы получаете очень надежные результаты.
В качестве альтернативы вы можете использовать статические анализаторы кода, которые просто смотрят на ваш код, но фактически не запускают его. Они работают намного быстрее, но из-за динамической природы python результаты не на 100% точны, поэтому вы можете их дважды проверить.
Два инструмента, которые приходят на ум, - pyflakes
и vulture
. Они дополняют друг друга: Pyflakes находит неиспользуемые импорты и неиспользуемые локальные переменные, в то время как стервятник находит неиспользуемые функции, методы, классы, переменные и атрибуты.
Инструменты доступны в индексе пакетов Python http://pypi.python.org/pypi.
Ответ 2
pylint может делать то, что вы хотите.
Ответ 3
Я не уверен, что это полезно, но вы можете попробовать использовать coverage, figleaf или другие подобные модули, которые записывают, какие части вашего исходного кода используются при запуске ваших скриптов/приложений.
Ответ 4
Из-за довольно жесткого способа представления кода python было бы сложно создать список функций на основе регулярного выражения, ищущего def function_name(..)
?
И затем ищите каждое имя и суммируйте, сколько раз он показывает в коде. Естественно, это не учитывало бы комментарии, но пока вы смотрите на функции с менее чем двумя или тремя экземплярами...
Это немного спартанец, но это звучит как хорошая задача сон-выходных =)
Ответ 5
если вы не знаете, что ваш код использует отражение, как вы сказали, я бы пошел на тривиальный grep. Не стоит недооценивать силу звездочки в vim (выполняет поиск слова, которое у вас есть под курсором в файле), хотя это ограничивается только файлом, который вы сейчас редактируете.
Еще одно решение, которое вы могли бы реализовать, - это иметь очень хороший testuite (редко бывает, к сожалению), а затем завершать процедуру с помощью процедуры устаревания. если вы получаете вывод устаревания, это означает, что процедура была вызвана, поэтому она все еще используется где-то. Это работает даже для поведения отражения, но, конечно, вы никогда не можете быть уверены, что не выполняете ситуацию, когда выполняется ваш обычный вызов.