Инструменты статического анализа Python: очистите код перед запуском

Инструменты статического анализа Python: очистите код перед запуском

25 апреля 2023 г.

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

https://www.reddit.com/r/ProgrammerHumor/comments/12mqjhz/the_difference/

Линтеры

Хорошо, обо всем по порядку, давайте поговорим о том, что такое линтер. Итак, есть инструмент под названием «lint», изначально предназначенный для анализа исходного кода C. Это похоже на ловушку для ворсинок в сушилке для белья, за исключением того, что вместо этого она улавливает небольшие программные ошибки. Эта утилита была создана Стивеном С. Джонсоном еще в 1978 году, когда он работал в Bell Labs. Оригинальный инструмент lint и другие подобные утилиты в основном использовались для анализа исходного кода с целью оптимизации компиляторов. Но со временем эти похожие на ворсинки инструменты стали делать гораздо больше, например выполнять другие типы проверок и проверок.

Стиль кода/проверки ошибок

1. Пифлейки

https://github.com/PyCQA/pyflakes

Простой инструмент, проверяющий исходные файлы Python на наличие ошибок. Pyflakes дает простое обещание: он никогда не будет жаловаться на стиль и будет очень и очень стараться никогда не выдавать ложных срабатываний.

<сильный>2. Pycodestyle (ранее назывался pep8)

https://github.com/PyCQA/pycodestyle

Pycodestyle – это инструмент для проверки кода Python на соответствие некоторым соглашениям о стилях в PEP 8. .

<сильный>3. Пидокстиль

https://github.com/PyCQA/pydocstyle

То же, что и Pycodestyle, но проверяет соглашения о строках документации.

<сильный>4. Пилинт

https://github.com/pylint-dev/pylint

Pylint анализирует ваш код, не запуская его. Он проверяет наличие ошибок, обеспечивает соблюдение стандарта кодирования, ищет запахи кода и может предложить варианты рефакторинга кода. .

<сильный>5. Пирома

https://github.com/regebro/pyroma

Это средство проверки стиля пакета, которое оценивает, насколько ваш проект соответствует передовым практикам экосистемы пакетов Python, и перечисляет проблемы, которые можно улучшить. Полезно для авторов публичных библиотек.

<сильный>6. Стервятник

https://github.com/jendrikseipp/vulture

Он находит мертвый код Python, включая неиспользуемые классы, функции и переменные. Это отличный инструмент для рефакторинга кода.

<сильный>7. Бандит

https://github.com/PyCQA/bandit

Bandit – это инструмент, предназначенный для поиска распространенных проблем безопасности в коде Python.

Проверки типов

Проверки типов помогают убедиться, что переменные и функции в вашем коде соответствуют друг другу с точки зрения типа.

<сильный>1. MyPy

https://github.com/python/mypy

Mypy — пионер в мире средств проверки типов Python. Он был написан Юккой Лехтосало в 2012 году при дальнейшем участии Гвидо ван Россума, Ивана Левкивского и многих других на протяжении многих лет. С помощью mypy добавьте подсказки типов (PEP 484) в свои программы на Python, и mypy предупреждать вас, когда вы используете эти типы неправильно. Подробную историю см. в этой документации.

<сильный>2. Авторское право (Майкрософт)

https://github.com/Microsoft/pyright

Первый общедоступный выпуск был выпущен в 2019 году. Pyright – это полнофункциональная стандартная программа проверки статических типов для Python. Он предназначен для высокой производительности и может использоваться с большими исходными базами Python. Pyright использует собственный синтаксический анализатор, который может восстанавливать синтаксические ошибки и продолжать синтаксический анализ. Напротив, mypy использует синтаксический анализатор, встроенный в интерпретатор Python, и не может восстанавливать синтаксические ошибки. Кроме того, mypy использует традиционную многопроходную архитектуру, в которой семантический анализ модуля выполняется несколько раз, пока все типы не сойдутся. Таким образом, pyright в 3-5 раз быстрее, чем mypy. Подробнее см. здесь.

<сильный>3. Пайер (Facebook)

https://github.com/facebook/pyre-check

Проверка типов, написанная на OCaml. Pyre с открытым исходным кодом, выпущенный в 2018 году, представляет собой высокоэффективную проверку типов для Python, соответствующую PEP 484. Он быстрее, чем mypy из-за параллельного запуска нескольких средств проверки и использует статический анализ снизу вверх. Он имеет встроенную проверку безопасности под названием Pysa, которая на самом деле находится поверх Pyre. Он поставляется с инструментами, которые помогут вам постепенно обновлять кодовую базу с помощью подсказок типов.

<сильный>4. Pytype (Google)

https://github.com/google/pytype

Pytype проверяет и определяет типы для вашего кода Python, не требуя аннотаций типов. Google разработал этот инструмент для своего гигантского монолитного репозитория; таким образом, этот инструмент особенно полезен для проверки больших кодовых баз.

Проверки сложности кода

Эти инструменты помогут сделать ваш код более читабельным. Самый популярный способ — вычислить цикломатическую сложность — число, используемое для демонстрации сложности программы. Он измеряет количество путей, которые можно пройти через код программы. Он был создан Томасом Дж. Маккейбом-старшим в 1976 году.

<сильный>1. Маккейб

https://github.com/PyCQA/mccabe

Простая проверка сложности McCabe. Его можно использовать как отдельное решение, а также как плагин для flake8.

<сильный>2. Радон

https://github.com/rubik/radon

Radon – это инструмент Python, который вычисляет различные показатели из исходного кода:

  • Сложность Маккейба, т. е. цикломатическая сложность
  • Необработанные показатели (включая исходные строки кода, строки комментариев, пустые строки и т. д.).
  • Показатели Холстеда (вики)
  • Индекс ремонтопригодности (тот, что используется в Visual Studio)

<сильный>3. хитрый

https://github.com/tonybaloney/wily

Приложение командной строки для отслеживания и составления отчетов о сложности тестов и приложений Python. Он может анализировать коммиты и строить отчет, чтобы показать, как меняется сложность и чей коммит портит эту метрику :)

Форматеры

Форматировщик кода – это инструмент, который автоматически форматирует код в соответствии с определенными стандартами или правилами. Они могут форматировать код, чтобы сделать его более читабельным, согласованным и удобным в сопровождении. Некоторые средства форматирования используют свои собственные правила, в то время как другие используют вывод линтера. Вот несколько примеров того, что могут делать средства форматирования: сортировка импорта, форматирование строк документации, форматирование кода в соответствии с руководствами по стилю, такими как PEP 8 и PEP 257 и т. д.

Инструменты форматирования кода серьезно экономят время, когда вы пытаетесь придерживаться руководства по стилю. Вы просто настраиваете его один раз и позволяете ему делать свою работу автоматически. Кроме того, это делает ваш запрос на вытягивание diffs намного легче читать.

https://www.reddit.com/r/ProgrammerHumor/comments/pszopm/little_contribution_to_the_indentation_war/

<сильный>1. Сортировать

https://github.com/PyCQA/isort

Это очень полезный инструмент для организации импорта в вашем коде.

<сильный>2. Форматирование документов

https://github.com/PyCQA/docformatter

Автоматически форматирует строки документации в соответствии с подмножеством соглашений PEP 257.

<сильный>3. Pydocstringformatter

https://github.com/DanielNoord/pydocstringformatter

Вдохновением для этого проекта послужил docformatter. Этот инструмент автоматически форматирует строки документации Python в соответствии с рекомендациями PEP 8 и PEP 257 (или другие поддерживаемые руководства по стилю).

<сильный>4. Черный

https://github.com/psf/black

Я лучше приведу цитату из описания проекта:

<цитата>

Black — это бескомпромиссный форматировщик кода Python. Используя его, вы соглашаетесь передать контроль над мелочами ручного форматирования. В свою очередь, Black дает вам скорость, детерминизм и свободу от pycodestyle ворчания по поводу форматирования. Вы сэкономите время и умственную энергию для более важных дел.

Зачерненный код выглядит одинаково независимо от проекта, который вы читаете. Через некоторое время форматирование становится прозрачным, и вместо этого вы можете сосредоточиться на содержании.

<сильный>5. YAPF (Еще один Python Formatter от Google)

https://github.com/google/yapf

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

<сильный>6. Автофлейк

https://github.com/PyCQA/autoflake

Удаляет неиспользуемый импорт и неиспользуемые переменные, о которых сообщает pyflakes.

<сильный>7. Обновление

https://github.com/asottile/pyupgrade

Инструмент для автоматического обновления синтаксиса для новых версий языка. Очень удобно поддерживать стиль кода в соответствии с самой последней версией Python.

<сильный>8. Автопеп8

https://github.com/hhatto/autopep8

Автоматически форматирует код Python в соответствии с руководством по стилю PEP 8. Он использует утилиту pycodestyle, чтобы определить, какие части кода необходимо отформатировать.

Мультиинструменты

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

<сильный>1. Взрыв8

https://github.com/PyCQA/flake8

Flake8 – это инструмент Python, который объединяет pycodestyle, pyflakes, mccabe и сторонние плагины для проверки стиля и качества некоторый код Python.

<сильный>2. Ерш

https://github.com/charliermarsh/ruff

Ruff можно использовать для замены Flake8 (плюс десятки плагинов), isort, pydocstyle, yesqa, Aerodicate, pyupgrade и autoflake, при этом работая в десятки или сотни раз быстрее, чем любой отдельный инструмент. . Это невероятно быстро!

<сильный>3. Старатель

https://github.com/PyCQA/prospector

Проверяет исходные файлы Python и предоставляет информацию о типе и расположении классов, методов и т. д. Он объединяет функциональные возможности других инструментов анализа Python, таких как Pylint, pycodestyle и сложность McCabe. Полный список см. в разделе документации Поддерживаемые инструменты.

Как бегать

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

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

Использование специального шага непрерывной интеграции (в GitHub Actions или GitLab CI/CD) — самый надежный способ проверки кода, откуда бы он ни исходил.

Заключение

Инструменты статического анализа кода Python необходимы для обнаружения дефектов на ранних этапах процесса разработки. Интеграция этих инструментов в ваш рабочий процесс может сэкономить время и улучшить качество кода, что приведет к более качественному конечному продукту. Я думаю, что для любых проектов следует использовать по крайней мере общий форматировщик кода (Black или YAPF) и средство проверки типов (я предпочитаю mypy). Чем раньше вы их настроите, тем меньше времени вы потратите на устранение проблем в будущем.

Ссылки

Видео

Вот дополнительные видеоматериалы об инструментах, упомянутых в этой статье.

Черный

Лукаш Ланга - Жизнь лучше покрасить в черный цвет, или Как перестать беспокоиться и использовать автоформатирование

Костер

Питер Хоимейер — Типы, более глубокий статический анализ и вы

Pytype

Натаниэль Маниста - Как я влюбился в Pytype & Почему вам тоже стоит это делать


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE