Подтвердить что ты не робот

Как вы можете найти неиспользуемые функции в коде Python?

Итак, у вас есть какой-то старый код, лежащий в довольно здоровом проекте. Как вы можете найти и удалить мертвые функции?

Я видел эти две ссылки: Найти неиспользуемый код и Инструмент для поиска неиспользуемых функций в php-проекте, но они кажутся специфичными для С# и PHP соответственно.

Есть ли инструмент Python, который поможет вам найти функции, которые не упоминаются нигде в исходном коде (несмотря на отражение/и т.д.)?

4b9b3361

Ответ 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 (редко бывает, к сожалению), а затем завершать процедуру с помощью процедуры устаревания. если вы получаете вывод устаревания, это означает, что процедура была вызвана, поэтому она все еще используется где-то. Это работает даже для поведения отражения, но, конечно, вы никогда не можете быть уверены, что не выполняете ситуацию, когда выполняется ваш обычный вызов.