PyLint, PyChecker oder PyFlakes? [geschlossen]

390

Ich möchte ein Feedback zu diesen Tools erhalten:

  • Eigenschaften;
  • Anpassungsfähigkeit;
  • Benutzerfreundlichkeit und Lernkurve.
e-satis
quelle
1
Welcher Tag-Standard hat damit zu tun?
SilentGhost
2
Weil Sie diese Tools verwenden, um PEP abzugleichen, insbesondere PEP 8, das der Standard für alle integrierten Python-Module ist.
E-Satis
und welche anderen peps soll es passen? denn für pep-8 gibt es ein eindeutiges Tag stackoverflow.com/questions/tagged/pep8
SilentGhost
Sie haben Recht, ich werde zu pep8 wechseln
e-satis
1
Sollte der Titel nicht so bearbeitet werden, dass er optional pep8 enthält? Zuerst dachte ich, ihr redet über den Vorschlag, nicht über ein tatsächliches PyPI-Paket.
Ehtesh Choudhury

Antworten:

275

Nun, ich bin ein bisschen neugierig, also habe ich die 3 gleich nach der Frage selbst getestet ;-)

Ok, dies ist keine sehr ernsthafte Bewertung, aber hier ist was ich sagen kann:

Ich habe die Tools mit den Standardeinstellungen (dies ist wichtig, da Sie Ihre Prüfregeln so gut wie auswählen können) im folgenden Skript ausprobiert :

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

Als Ergebnis :

  • PyCheckerist problematisch, weil es das Modul kompiliert, um es zu analysieren. Wenn Sie nicht möchten, dass Ihr Code ausgeführt wird (z. B. eine SQL-Abfrage ausführt), ist das schlecht.
  • PyFlakessoll lite sein. In der Tat wurde entschieden, dass der Code perfekt war. Ich bin auf der Suche nach etwas ziemlich Schwerem, also glaube ich nicht, dass ich es versuchen werde.
  • PyLint war sehr gesprächig und bewertete den Code 3/10 (OMG, ich bin ein schmutziger Codierer!).

Stärken von PyLint:

  • Sehr beschreibender und genauer Bericht.
  • Erkennen Sie einige Codegerüche. Hier wurde mir gesagt, ich solle meine Klasse fallen lassen, um etwas mit Funktionen zu schreiben, da der OO-Ansatz in diesem speziellen Fall nutzlos war. Etwas, das ich wusste, aber nie erwartet hatte, dass mir ein Computer sagt :-p
  • Der vollständig korrigierte Code wird schneller ausgeführt (keine Klasse, keine Referenzbindung ...).
  • Hergestellt von einem französischen Team. Ok, es ist nicht für alle ein Plus, aber ich mag es ;-)

Nachteile von PyLint:

  • Einige Regeln sind sehr streng. Ich weiß, dass Sie es ändern können und dass die Standardeinstellung PEP8 entspricht, aber ist es so ein Verbrechen, 'für x in seq' zu schreiben? Anscheinend ja, weil Sie keinen Variablennamen mit weniger als 3 Buchstaben schreiben können. Ich werde das ändern.
  • Sehr sehr gesprächig. Sei bereit, deine Augen zu benutzen.

Korrigiertes Skript (mit faulen Dokumentzeichenfolgen und Variablennamen):

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

BEARBEITEN:

Dank Rüdiger Wolf entdeckte ich, pep8dass es genau das tut, was sein Name andeutet: passendes PEP8. Es wurden mehrere Syntax-No-Nos gefunden, die PyLint nicht gefunden hat. Aber PyLintfand Sachen, die nicht speziell mit PEP8 verbunden waren, aber interessant. Beide Tools sind interessant und ergänzen sich.

Irgendwann werde ich beides verwenden, da es sehr einfach zu installieren ist (über Pakete oder Setuptools) und der Ausgabetext so einfach zu verketten ist.

Um Ihnen eine kleine Vorstellung von ihrer Ausgabe zu geben:

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    |=          |
+-------------------------+------+---------+-----------+
e-satis
quelle
18
Der Zweck von Pyflakes besteht darin, Ihren Code statisch zu analysieren, um sicherzustellen, dass keine Namensfehler oder nicht verwendeten Variablen / Importe auftreten.
Culebrón
4
Verstehe ich das falsch oder gibt es keine Stärken / Schwächen für PyChecker oder PyFlakes?
Wernight
17
"Stärken: Sehr beschreibender und genauer Bericht." Welcher Bericht? Geht es in diesem Abschnitt um alle Tools oder nur um eines?
ijk
3
Ich wundere mich. Ich habe das ganze Pro / Contra nur über PyLint geschrieben. Ich habe keine Ahnung, warum ich so dumm geschrieben habe. Kater vielleicht? Tut mir leid, Leute.
E-Satis
13
flake8 deckt beide pyflakesund ab pep8. Schlagen Sie es dringend vor, nur das eine oder andere zu verwenden.
Ehtesh Choudhury
93

pep8 wurde kürzlich zu PyPi hinzugefügt.

  • pep8 - Python Style Guide Checker
  • pep8 ist ein Tool zum Überprüfen Ihres Python-Codes anhand einiger Stilkonventionen in PEP 8.

Es ist jetzt super einfach, Ihren Code mit pep8 zu vergleichen.

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

Rüdiger Wolf
quelle
57
Es gibt IMO besseres Paket. flake8, kombiniert beide und fügt bedingte Komplexität hinzu, arbeitet mit Verzeichnissen und ist im Allgemeinen gut.
DinGODzilla
1
Beim ersten Laufen flake8habe ich gelernt, dass ich direkt in ein Projekt gesprungen bin, ohne zu erfahren, dass Python aus irgendeinem Grund Leerzeichen bevorzugt. Ich musste verwenden --ignore W191, um die Ausgabe nützlich zu machen.
cjm
3
Beachten Sie, dass aktuelle Versionen von pep8jetzt aufgerufen werden pycodestyle. Siehe pypi.org/project/pycodestyle @cjm: Python bevorzugt nachdrücklich Leerzeichen, da dies in den Stilrichtlinien festgelegt ist. Räume sind nicht unbedingt überlegen, aber die Konsistenz in der gesamten Community ist ein großer Vorteil, und die Community hat sich für Räume entschieden.
Chris L. Barnes
Wie konfiguriere ich meinen Editor (entweder BBEdit oder vim) am besten so, dass Leerzeichen für Python und Tabulatoren für absolut alles andere verwendet werden? Es scheint, dass es (zumindest für BBEdit) eine globale Umgebung ist.
cjm
1
@cjm In vim können Sie :set et(kurz für expandtabs) :retaballe Registerkarten im aktuellen Puffer in Leerzeichen konvertieren. Es kann auch sinnvoll sein , zu setzen ts=4 sts=4 sw=4( tabstop, softtabstop, shiftwidth) aus . Im Allgemeinen bevorzuge ich die Verwendung von editorconfig.org und seiner Plugins, um die richtigen Einstellungen in einem Repo festzulegen , sodass Sie sich nicht um die Neukonfiguration Ihres Editors für verschiedene Codebasen kümmern müssen.
Codermonkeyfuel