Как я могу проанализировать код Python, чтобы определить проблемные области?

99

У меня большой исходный репозиторий, разделенный на несколько проектов. Я хотел бы подготовить отчет о состоянии исходного кода с указанием проблемных областей, которые необходимо решить.

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

Как я могу построить такой отчет?

Джеруб
источник

Ответы:

36

Для измерения цикломатической сложности есть хороший инструмент, доступный на traceback.org . На странице также дается хороший обзор того, как интерпретировать результаты.

+1 за пилинт . Он отлично подходит для проверки соблюдения стандартов кодирования (будь то PEP8 или вариант вашей собственной организации), что в конечном итоге может помочь снизить цикломатическую сложность.

Майк Гриффит
источник
4
traceback.org не работает ссылка
denfromufa
Пилинт отличный, но медленный. Мы используем как pre-push hook, но используем flake8 и несколько плагинов для регулярных проверок и pre-commit hook. Я бы действительно рекомендовал в https://flakehell.readthedocs.io/config.htmlнаши дни, так как эта модель выполнения намного более надежна и настраиваема.
DylanYoung,
29

Для цикломатической сложности вы можете использовать radon: https://github.com/rubik/radon

(Используется pipдля его установки: pip install radon)

Кроме того, он также имеет следующие функции:

  • необработанные метрики (к ним относятся SLOC, строки комментариев, пустые строки и т. д.)
  • Метрики Холстеда (все)
  • Индекс ремонтопригодности (тот, что используется в Visual Studio)
Дэйв Холтер
источник
Что делать, чтобы получить показатели Холстеда?
Дима Тиснек 01
1
@qarma Если я понимаю документацию, я не думаю, что вы можете использовать командную строку. Вы должны использовать Python API.
Дэйв Холтер
18

Для статического анализа есть pylint и pychecker . Лично я использую pylint, поскольку он кажется более всеобъемлющим, чем pychecker.

Для цикломатической сложности вы можете попробовать эту программу на Perl или эту статью, в которой представлена ​​программа на Python, которая делает то же самое.

свободное место
источник
11

Pycana работает как шарм, когда вам нужно разобраться в новом проекте!

PyCAna (Python Code Analyzer) - красивое название для простого анализатора кода для Python, который создает диаграмму классов после выполнения вашего кода.

Посмотрите, как это работает: http://pycana.sourceforge.net/

вывод:

альтернативный текст

мсемельман
источник
6

Используйте flake8 , который обеспечивает анализ pep8, pyflakes и цикломатической сложности в одном инструменте

Уэс Кендалл
источник
4

Существует инструмент CloneDigger, который помогает вам находить похожие фрагменты кода.

Анонимный
источник
1
Он не работает с Python 3 и никогда не поддерживался в хорошем состоянии.
Acumenus 08
3

Для проверки цикломатической сложности, конечно, есть mccabeпакет.

Монтаж:

$ pip install --upgrade mccabe

Использование:

$ python -m mccabe --min=6 path/to/myfile.py

Обратите внимание на порог в 6 выше. Согласно этому ответу , оценки> 5, вероятно, следует упростить.

Пример вывода с --min=3:

68:1: 'Fetcher.fetch' 3
48:1: 'Fetcher._read_dom_tag' 3
103:1: 'main' 3

При желании его также можно использовать через pylint-mccabe или pytest-mccabe и т. Д.

Acumenus
источник