PyLint, PyChecker o PyFlakes? [chiuso]


390

Vorrei ricevere un feedback su questi strumenti su:

  • Caratteristiche;
  • adattabilità;
  • facilità d'uso e curva di apprendimento.

1
quale tag standard ha a che fare con questo?
SilentGhost,

2
Perché usi questi strumenti per abbinare PEP, in particolare PEP 8 che è lo standard per tutti i moduli Python integrati.
e-satis,

e quali altri pep vuoi che corrispondano? perché per pep-8 v'è un tag inequivocabile stackoverflow.com/questions/tagged/pep8
SilentGhost

Hai ragione, passerò a pep8
e-satis il

1
Il titolo non dovrebbe essere modificato per includere pep8 come opzione? All'inizio, pensavo che parlaste della proposta, non di un vero pacchetto PyPI.
Ehtesh Choudhury,

Risposte:


275

Bene, sono un po 'curioso, quindi ho appena provato il 3 da solo subito dopo aver posto la domanda ;-)

Ok, questa non è una recensione molto seria ma ecco cosa posso dire:

Ho provato gli strumenti con le impostazioni predefinite (è importante perché puoi praticamente scegliere le tue regole di controllo) sul seguente script:

#!/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)

Di conseguenza :

  • PyCheckerè problematico perché compila il modulo per analizzarlo. Se non si desidera eseguire il codice (ad esempio, esegue una query SQL), non va bene.
  • PyFlakesdovrebbe essere lite. In effetti, ha deciso che il codice era perfetto. Sto cercando qualcosa di abbastanza grave, quindi non credo che ci proverò.
  • PyLint è stato molto loquace e ha valutato il codice 3/10 (OMG, sono un programmatore sporco!).

Punti forti di PyLint:

  • Rapporto molto descrittivo e accurato.
  • Rileva alcuni odori di codice. Qui mi ha detto di abbandonare la mia classe per scrivere qualcosa con funzioni perché l'approccio OO era inutile in questo caso specifico. Qualcosa che sapevo, ma non mi sarei mai aspettato che un computer mi dicesse :-p
  • Il codice completamente corretto viene eseguito più rapidamente (nessuna classe, nessuna associazione di riferimento ...).
  • Realizzato da un team francese. Ok non è un vantaggio per tutti, ma mi piace ;-)

Contro di PyLint:

  • Alcune regole sono molto rigide. So che puoi cambiarlo e che il valore predefinito è PEP8, ma è un tale crimine scrivere "per x in seq"? Apparentemente sì perché non puoi scrivere un nome variabile con meno di 3 lettere. Lo cambierò.
  • Molto loquace. Sii pronto a usare i tuoi occhi.

Script corretto (con stringhe di documenti pigri e nomi di variabili):

#!/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)

MODIFICARE :

Grazie a Rudiger Wolf, ho scoperto pep8che fa esattamente ciò che suggerisce il suo nome: abbinare PEP8. Ha trovato diversi no-no di sintassi che PyLint non ha fatto. Ma PyLintho trovato cose che non erano specificamente collegate a PEP8 ma interessanti. Entrambi gli strumenti sono interessanti e complementari.

Alla fine userò entrambi poiché ci sono davvero facili da installare (tramite pacchetti o setuptools) e il testo di output è così facile da concatenare.

Per darti una piccola idea del loro output:

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    |=          |
+-------------------------+------+---------+-----------+

18
Lo scopo di pyflakes è di analizzare staticamente il codice per assicurarsi che non vi siano errori di nome o variabili / importazioni non utilizzate.
culebrón,

4
Sto sbagliando o non c'è un punto forte / debole per PyChecker né PyFlakes?
Wernight,

17
"Punti forti: rapporto molto descrittivo e accurato." Quale rapporto? Questa sezione riguarda tutti gli strumenti o solo uno?
vedi il

3
Mi chiedo. Ho scrupolosamente scritto l'intero pro / contro solo su PyLint. Non ho idea del perché ho scritto in questo modo stupido. Postumi di una sbornia forse? Scusate ragazzi.
e-soddisfa il

13
flake8 copre sia pyflakese pep8. Lo consiglio vivamente di usare solo l'uno o l'altro.
Ehtesh Choudhury,

93

pep8 è stato recentemente aggiunto a PyPi.

  • pep8 - Controllo della guida dello stile Python
  • pep8 è uno strumento per verificare il codice Python rispetto ad alcune convenzioni di stile in PEP 8.

Ora è super facile controllare il tuo codice con pep8.

Vedi http://pypi.python.org/pypi/pep8


57
Esiste un pacchetto IMO migliore. flake8, unisce i due e aggiunge complessità condizionale, lavora su directory ed è generalmente buono.
DinGODzilla,

1
Correre flake8per la prima volta mi ha insegnato che sono entrato subito in un progetto senza sapere che Python preferisce fortemente gli spazi per qualche motivo. Ho dovuto usare --ignore W191per rendere utile l'output.
Cm

3
Si noti che le versioni recenti di pep8sono ora chiamate pycodestyle; vedi pypi.org/project/pycodestyle @cjm: python preferisce fortemente gli spazi perché questo è ciò che è specificato dalle linee guida di stile. Gli spazi non sono necessariamente superiori, ma la coerenza all'interno della comunità è un grande vantaggio e la comunità ha deciso sugli spazi, quindi fallo.
Chris L. Barnes,

Come configuro meglio il mio editor (BBEdit o vim) per utilizzare gli spazi per Python e le schede per tutto il resto? Sembra che (almeno per BBEdit) sia un'impostazione globale.
Cjm,

1
@cjm In vim, puoi fare :set et(abbreviazione di expandtabs) e quindi :retabconvertire tutte le schede nel buffer corrente in spazi. Può anche essere utile impostare ts=4 sts=4 sw=4( tabstop, softtabstop, shiftwidth) per primo. Per quanto riguarda un approccio generale, preferisco usare editorconfig.org e i suoi plugin per impostare le giuste impostazioni in un repository, quindi non devi preoccuparti di riconfigurare il tuo editor per basi di codice diverse.
codermonkeyfuel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.