Chciałbym uzyskać informacje zwrotne na temat tych narzędzi:
- funkcje;
- zdolność adaptacji;
- łatwość użycia i krzywa uczenia się.
Chciałbym uzyskać informacje zwrotne na temat tych narzędzi:
Odpowiedzi:
Cóż, jestem trochę ciekawy, więc sam przetestowałem 3 zaraz po zadaniu pytania ;-)
Ok, to nie jest bardzo poważna recenzja, ale oto co mogę powiedzieć:
Wypróbowałem narzędzia z ustawieniami domyślnymi (jest to ważne, ponieważ możesz właściwie wybrać reguły sprawdzania) na następującym skrypcie:
#!/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)
W rezultacie :
PyChecker
jest kłopotliwy, ponieważ kompiluje moduł do jego analizy. Jeśli nie chcesz, aby Twój kod działał (np. Wykonuje zapytanie SQL), to źle.PyFlakes
ma być lite. Rzeczywiście zdecydował, że kod był doskonały. Szukam czegoś dość surowego, więc nie sądzę, żebym poszedł na to.PyLint
był bardzo rozmowny i ocenił kod 3/10 (OMG, jestem brudnym programistą!).Zalety PyLint
:
Wady PyLint
:
Poprawiony skrypt (z leniwymi ciągami dokumentów i nazwami zmiennych):
#!/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)
EDYTOWAĆ :
Dzięki Rudiger Wolf odkryłem, pep8
że robi dokładnie to, co sugeruje jego nazwa: dopasowanie PEP8. Znaleziono kilka składni no-nos, których PyLint nie. Ale PyLint
znalazłem rzeczy, które nie były specjalnie powiązane z PEP8, ale były interesujące. Oba narzędzia są interesujące i uzupełniają się.
W końcu skorzystam z obu, ponieważ są naprawdę łatwe do zainstalowania (za pomocą pakietów lub setuptools), a tekst wyjściowy jest tak łatwy do połączenia w łańcuch.
Aby dać ci pojęcie o ich wynikach:
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 |= |
+-------------------------+------+---------+-----------+
pep8 został niedawno dodany do PyPi.
Teraz bardzo łatwo jest sprawdzić kod w stosunku do pep8.
flake8
, łączy te dwa elementy i dodaje warunkową złożoność, działa na katalogach i ogólnie jest dobry.
flake8
po raz pierwszy nauczyło mnie, że wskoczyłem od razu do projektu, nie dowiadując się, że z jakiegoś powodu Python zdecydowanie preferuje spacje. Musiałem użyć, --ignore W191
aby wynik był użyteczny.
pep8
są teraz nazywane pycodestyle
; zobacz pypi.org/project/pycodestyle @cjm: python zdecydowanie preferuje spacje, ponieważ tak określają wytyczne stylu. Miejsca niekoniecznie są lepsze, ale spójność w całej społeczności jest wielką zaletą, a społeczność decyduje o przestrzeniach, więc zrób to.
:set et
(skrót expandtabs
), a następnie :retab
przekonwertować wszystkie tabulatory w bieżącym buforze na spacje. Może on także być przydatny do ustawiania ts=4 sts=4 sw=4
( tabstop
, softtabstop
, shiftwidth
) po raz pierwszy. Jeśli chodzi o ogólne podejście, wolę używać Editorconfig.org i jego wtyczek, aby ustawić odpowiednie ustawienia w repozytorium, więc nie musisz się martwić o zmianę konfiguracji edytora dla różnych baz kodu.