Инструмент для обеспечения стиля и стандартов кода python

Я пытаюсь найти инструмент для проверки стиля кодирования в python.

Для PHP я видел, что есть Sniffer кода и небольшой perl script, используемый Drupal. Есть ли такой инструмент для кода python?

Ответы

Ответ 1

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

Это может быть немного многословно, жалуясь на такие вещи, как строки длиной более 80 символов, переменная, не соответствующая определенным регулярным выражениям, классы, имеющие слишком мало общедоступных методов, методы, отсутствующие в документах.

Например, для script..

import os
import somefakelib

def myfunc(x):
    blah = "Something"
    print os.listdir( x+blh )

PyLint генерирует следующие сообщения:

C:  1: Missing docstring
F:  2: Unable to import 'somefakelib' (No module named somefakelib)
C:  4:myfunc: Missing docstring
C:  4:myfunc: Invalid name "x" (should match [a-z_][a-z0-9_]{2,30}$)
C:  4:myfunc: Invalid name "x" (should match [a-z_][a-z0-9_]{2,30}$)
E:  6:myfunc: Undefined variable 'blh'
W:  5:myfunc: Unused variable 'blah'
W:  2: Unused import somefakelib

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

#pylint:disable-msg=R0903,C0103,R0903,F0401,C0301

.. или как аргументы командной строки для команды PyLint:

pylint --disable-msg=R0903,C0103,R0903,F0401,C0301 myfile.py

При отключенных выше сообщениях он генерирует следующие сообщения для вышеуказанного кода:

C:  1: Missing docstring
C:  4:myfunc: Missing docstring
E:  6:myfunc: Undefined variable 'blh'
W:  5:myfunc: Unused variable 'blah'
W:  2: Unused import somefakelib

PyLint также генерирует "отчет о кодах", в том числе количество строк кода/комментариев/docstring/whitespace файла, количество сообщений в категории и дает вашему коду "оценку" - 10 не являются сообщениями, 0 как правило, является синтаксической ошибкой

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

example.py:2: 'somefakelib' imported but unused
example.py:6: undefined name 'blh'

Последний вариант, который я использую, pep8.py, который, как следует из названия, предусматривает PEP8. Это, безусловно, самый.. педантичный script, применяя такие вещи, как правильные пустые строки до/после функций/классов, расстояние вокруг кода, исправление 4-пространственного отступа и т.д.

Выполняя приведенный выше код, он производит следующее:

example.py:4:1: E302 expected 2 blank lines, found 1
example.py:6:23: E201 whitespace after '('
example.py:6:32: W292 no newline at end of file

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

pep8.py изначально был анонсирован в списке рассылки python здесь, но ссылка на скачивание в этом теперь мертва. Там есть github mirror через cburroughs, с несколькими незначительными исправлениями в github.com/cburroughs/pep8.py, или вы можете захватить немодифицированную версию из более старая версия

PyChecker - еще один вариант, хотя я его не использовал

Ответ 2

pylint и pyflakes будет хорошее начало.

pylint, в частности, очень настраиваема, и вы можете обеспечить выполнение нескольких вещей с ней.

Ответ 3

Нашел этот вопрос stackoverflow во время поиска инструмента принудительного исполнения стиля pep8 при использовании существующего (устаревшего) проекта.

https://github.com/hhatto/autopep8

autopep8 -i yourpythonsourcefile.py

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

Ответ 4

Theres a script, называемый reindent.py, который иногда включается в ваш дистрибутив системы python, который будет проходить и повторно отступать весь ваш код до рекомендуемого 4-х отступов.

Получает его копию, если вы не можете найти ее в своем дистрибутиве: http://www.koders.com/python/fid24D30FCD2CE388C67CB980EF55630D25970CFB96.aspx?s=cdef%3Aparser