Ответ 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 - еще один вариант, хотя я его не использовал