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

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

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

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

5 ответов


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

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

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


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


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


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

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

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


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

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