Как вы можете найти неиспользуемые функции в коде Python? - PullRequest
50 голосов
/ 28 марта 2009

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

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

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

Ответы [ 5 ]

53 голосов
/ 22 марта 2012

В python вы можете найти неиспользуемый код с помощью динамического или статического анализатора кода. Два примера динамических анализаторов: coverage и figleaf. У них есть недостаток, заключающийся в том, что вам нужно запускать все возможные ветви вашего кода, чтобы найти неиспользуемые части, но они также имеют то преимущество, что вы получаете очень надежные результаты.

Кроме того, вы можете использовать статические анализаторы кода, которые просто смотрят на ваш код, но на самом деле не запускают его. Они работают намного быстрее, но из-за динамического характера Python результаты не на 100% точны, поэтому вы можете проверить их еще раз. На ум приходят два инструмента: pyflakes и vulture. Они дополняют друг друга: Pyflakes находит неиспользуемые импортные и неиспользуемые локальные переменные, а Vulture находит неиспользуемые функции, методы, классы, переменные и атрибуты.

Инструменты доступны в индексе пакетов Python http://pypi.python.org/pypi.

8 голосов
/ 28 марта 2009

Пилинт может делать то, что вы хотите.

4 голосов
/ 28 марта 2009

Я не уверен, что это полезно, но вы можете попробовать использовать покрытие , figleaf или другие подобные модули, которые записывают, какие части вашего исходного кода используются как вы на самом деле запускаете свои скрипты / приложения.

1 голос
/ 28 марта 2009

если вы не знаете, что ваш код использует отражение, как вы сказали, я бы пошел на тривиальный grep. Не стоит недооценивать и силу звездочки в vim (выполняет поиск по слову, которое находится под вашим курсором в файле), хотя это ограничено только файлом, который вы редактируете в настоящее время.

Другое решение, которое вы могли бы реализовать, - это получить очень хороший набор тестов (к сожалению, это случается редко), а затем обернуть подпрограмму процедурой устаревания. если вы получите вывод об устаревании, это означает, что подпрограмма была вызвана, поэтому она все еще где-то используется. Это работает даже для поведения отражения, но, конечно, вы никогда не можете быть уверены, что не вызовете ситуацию, когда выполняется ваш обычный вызов.

1 голос
/ 28 марта 2009

Из-за довольно строгого представления кода на языке Python трудно будет составить список функций на основе регулярного выражения, ищущего def function_name(..)?

А затем найдите каждое имя и подсчитайте, сколько раз оно фигурирует в коде. Естественно, это не будет принимать во внимание комментарии, но пока вы смотрите на функции с менее чем двумя или тремя экземплярами ...

Это немного по-спартански, но звучит как хорошее задание сонных выходных =)

...