Я хотел бы получить отзывы об этих инструментах:
- функции;
- адаптивность;
- простота использования и обучения.
Я хотел бы получить отзывы об этих инструментах:
Ответы:
Что ж, мне немного любопытно, поэтому я сам проверил 3 сразу после того, как задал вопрос ;-)
Хорошо, это не очень серьезный обзор, но вот что я могу сказать:
Я попробовал инструменты с настройками по умолчанию (это важно, потому что вы можете выбрать правила проверки) в следующем сценарии:
#!/usr/local/bin/python
# by Daniel Rosengren modified by e-satis
import sys, time
stdout = sys.stdout
BAILOUT = 16
MAX_ITERATIONS = 1000
class Iterator(object) :
def __init__(self):
print 'Rendering...'
for y in xrange(-39, 39):
stdout.write('\n')
for x in xrange(-39, 39):
if self.mandelbrot(x/40.0, y/40.0) :
stdout.write(' ')
else:
stdout.write('*')
def mandelbrot(self, x, y):
cr = y - 0.5
ci = x
zi = 0.0
zr = 0.0
for i in xrange(MAX_ITERATIONS) :
temp = zr * zi
zr2 = zr * zr
zi2 = zi * zi
zr = zr2 - zi2 + cr
zi = temp + temp + ci
if zi2 + zr2 > BAILOUT:
return i
return 0
t = time.time()
Iterator()
print '\nPython Elapsed %.02f' % (time.time() - t)
В результате :
PyChecker
хлопотно, потому что он компилирует модуль для его анализа. Если вы не хотите, чтобы ваш код выполнялся (например, он выполняет запрос SQL), это плохо.PyFlakes
должен быть облегченным. Действительно, он решил, что код был идеальным. Я ищу что-то довольно серьезное, поэтому я не думаю, что пойду на это.PyLint
был очень разговорчив и оценил код 3/10 (OMG, я грязный кодер!).Сильные стороны PyLint
:
Минусы PyLint
:
Исправленный скрипт (с ленивыми строками документов и именами переменных):
#!/usr/local/bin/python
# by Daniel Rosengren, modified by e-satis
"""
Module doctring
"""
import time
from sys import stdout
BAILOUT = 16
MAX_ITERATIONS = 1000
def mandelbrot(dim_1, dim_2):
"""
function doc string
"""
cr1 = dim_1 - 0.5
ci1 = dim_2
zi1 = 0.0
zr1 = 0.0
for i in xrange(MAX_ITERATIONS) :
temp = zr1 * zi1
zr2 = zr1 * zr1
zi2 = zi1 * zi1
zr1 = zr2 - zi2 + cr1
zi1 = temp + temp + ci1
if zi2 + zr2 > BAILOUT:
return i
return 0
def execute() :
"""
func doc string
"""
print 'Rendering...'
for dim_1 in xrange(-39, 39):
stdout.write('\n')
for dim_2 in xrange(-39, 39):
if mandelbrot(dim_1/40.0, dim_2/40.0) :
stdout.write(' ')
else:
stdout.write('*')
START_TIME = time.time()
execute()
print '\nPython Elapsed %.02f' % (time.time() - START_TIME)
РЕДАКТИРОВАТЬ :
Благодаря Rudiger Wolf я обнаружил, pep8
что он делает именно то, что предполагает его название: соответствие PEP8. Он нашел несколько синтаксисов, которые PyLint не нашел. Но PyLint
нашел материал, который не был специально связан с PEP8, но интересен. Оба инструмента интересны и дополняют друг друга.
В конце концов я буду использовать оба, так как их очень легко установить (через пакеты или setuptools), а выводимый текст так просто связать.
Чтобы дать вам небольшое представление об их выводе:
pep8 :
./python_mandelbrot.py:4:11: E401 multiple imports on one line
./python_mandelbrot.py:10:1: E302 expected 2 blank lines, found 1
./python_mandelbrot.py:10:23: E203 whitespace before ':'
./python_mandelbrot.py:15:80: E501 line too long (108 characters)
./python_mandelbrot.py:23:1: W291 trailing whitespace
./python_mandelbrot.py:41:5: E301 expected 1 blank line, found 3
PyLint :
************* Module python_mandelbrot
C: 15: Line too long (108/80)
C: 61: Line too long (85/80)
C: 1: Missing docstring
C: 5: Invalid name "stdout" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C: 10:Iterator: Missing docstring
C: 15:Iterator.__init__: Invalid name "y" (should match [a-z_][a-z0-9_]{2,30}$)
C: 17:Iterator.__init__: Invalid name "x" (should match [a-z_][a-z0-9_]{2,30}$)
[...] and a very long report with useful stats like :
Duplication
-----------
+-------------------------+------+---------+-----------+
| |now |previous |difference |
+=========================+======+=========+===========+
|nb duplicated lines |0 |0 |= |
+-------------------------+------+---------+-----------+
|percent duplicated lines |0.000 |0.000 |= |
+-------------------------+------+---------+-----------+
pyflakes
и pep8
. Настоятельно рекомендуем это просто с помощью одного или другого.
pep8 был недавно добавлен в PyPi.
Теперь очень просто проверить ваш код по сравнению с pep8.
Смотрите http://pypi.python.org/pypi/pep8
flake8
, он объединяет два и добавляет условную сложность, работает с каталогами и в целом хорош.
flake8
в первый раз научил меня, что я запрыгнул прямо в проект, не узнав, что Python почему-то сильно предпочитает пробелы. Я должен был использовать, --ignore W191
чтобы сделать вывод полезным.
pep8
теперь называются pycodestyle
; см. pypi.org/project/pycodestyle @cjm: python сильно предпочитает пробелы, потому что это то, что указано в рекомендациях по стилю. Пространства не обязательно превосходят друг друга, но согласованность в сообществе является большим преимуществом, и сообщество выбрало места, так что сделайте это.
:set et
(сокращение expandtabs
), а затем :retab
преобразовать все вкладки в текущем буфере в пробелы. Он также может быть полезно для установки ts=4 sts=4 sw=4
( tabstop
, softtabstop
, shiftwidth
) в первую очередь. Что касается общего подхода, я предпочитаю использовать editorconfig.org и его плагины, чтобы установить правильные настройки в репозитории, поэтому вам не нужно беспокоиться о перенастройке вашего редактора для разных кодовых баз.