webentwicklung-frage-antwort-db.com.de

PyLint, PyChecker oder PyFlakes?

Ich möchte ein Feedback zu diesen Tools erhalten über:

  • eigenschaften;
  • anpassungsfähigkeit;
  • benutzerfreundlichkeit und Lernkurve.
375
e-satis

Nun, ich bin ein bisschen neugierig, also habe ich die 3 gleich selbst getestet, nachdem ich die Frage gestellt hatte ;-)

Ok, das ist keine sehr ernste Kritik, aber hier ist, was ich sagen kann:

Ich habe die Tools ausprobiert mit den Standardeinstellungen (es ist wichtig, weil Sie so ziemlich Ihre Prüfregeln auswählen können) für das folgende Skript:

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

  • PyChecker ist problematisch, weil es das Modul kompiliert, um es zu analysieren. Wenn Sie nicht möchten, dass Ihr Code ausgeführt wird (z. B. wenn eine SQL-Abfrage ausgeführt wird), ist das schlecht.
  • PyFlakes soll lite sein. In der Tat wurde festgestellt, 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 mit 3/10 (OMG, ich bin ein schmutziger Programmierer!).

Strongs Punkte von PyLint:

  • Sehr aussagekräftiger und genauer Bericht.
  • Erkennen Sie einige Code-Gerüche. Hier sagte es mir, ich solle meine Klasse fallen lassen, um etwas mit Funktionen zu schreiben, weil der OO) - Ansatz in diesem speziellen Fall nutzlos war
  • Der vollständig korrigierte Code wird schneller ausgeführt (keine Klasse, keine Referenzbindung ...).
  • Hergestellt von einem französischen Team. Ok es ist nicht jedermanns Sache, 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 ein solches Verbrechen, 'for 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 Lazy Doc Strings 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)

EDIT:

Dank Rüdiger Wolf entdeckte ich pep8 das macht genau das, was sein Name andeutet: passend zu PEP8. Es wurden mehrere Syntax-Nrn. Gefunden, die PyLint nicht kannte. Aber PyLint hat Dinge gefunden, die nicht speziell mit PEP8 verknüpft, aber interessant waren. Beide Tools sind interessant und ergänzen sich.

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

Um Ihnen einen kleinen Eindruck 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    |=          |
+-------------------------+------+---------+-----------+
264
e-satis

pep8 wurde kürzlich zu PyPi hinzugefügt.

  • pep8 - Python style guide checker
  • pep8 ist ein Tool, mit dem Sie Ihren Python) - Code anhand einiger Stilkonventionen in PEP 8 überprüfen können.

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

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

92
Rudiger Wolf