PyLint, PyChecker ou PyFlakes? [fermé]

j'aimerais faire quelques commentaires sur ces outils :

  • ;
  • adaptabilité;
  • la facilité d'utilisation et la courbe d'apprentissage.
358
demandé sur John Y 2009-09-15 22:24:15

2 réponses

Eh bien, je suis un peu curieux, donc je viens de tester les 3 moi-même juste après avoir posé la question; -)

Ok, ce n'est pas très grave, mais voici ce que je peux dire :

j'ai essayé les outils avec les paramètres par défaut (c'est important parce que vous pouvez à peu près choisir vos règles de vérification) sur le script suivant:

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

résultat:

  • PyChecker est gênant car il compile le module pour l'analyser. Si vous ne voulez pas que votre code s'exécute (E. g, il exécute une requête SQL), c'est mauvais.
  • PyFlakes est censé être lite. En effet, il a décidé que le code était parfait. Je cherche quelque chose de très sévère donc je ne pense pas que je vais le faire.
  • PyLint a été très bavard et a évalué le code 3/10 (OMG, je suis un codeur sale !).

points forts de PyLint :

  • rapport très descriptif et précis.
  • détecte des odeurs de code. Ici, il m'a dit de laisser tomber ma classe pour écrire quelque chose avec des fonctions parce que l'approche OO était inutile dans ce cas précis. Quelque chose que je savais, mais je ne m'attendais pas à ce qu'un ordinateur me dise: - p
  • le code entièrement corrigé court plus vite (Non Classe, pas de reliure de référence...).
  • Fabriqué par une équipe française. Ok c'est pas un plus pour tout le monde, mais j'aime ça ;-)

Cons PyLint :

  • certaines règles sont très strictes. Je sais que vous pouvez le changer et que la valeur par défaut est de correspondre à PEP8, mais est-ce un tel crime d'écrire "pour x dans seq"? Apparemment oui parce que vous ne pouvez pas écrire un nom de variable avec moins de 3 lettre. Je vais changer ça.
  • très bavard. Être prêt à utiliser vos yeux.

Corrigé script (avec lazy doc chaînes et les noms de variables) :

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

grâce à Rudiger Wolf, j'ai découvert pep8 qui fait exactement ce que son nom suggère: correspondant à PEP8. Il a trouvé plusieurs no-nos de syntaxe que PyLint n'a pas. Mais PyLint j'ai trouvé des choses qui n'étaient pas spécifiquement liées à PEP8 mais intéressantes. Les deux outils sont intéressants et complémentaires.

finalement je vais utiliser les deux puisqu'il y a vraiment facile à installer (via des paquets ou setuptools) et le texte de sortie est si facile à enchaîner.

pour vous donner une petite idée de leur production:

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    |=          |
+-------------------------+------+---------+-----------+
259
répondu e-satis 2018-06-15 05:12:00

pep8 a été récemment ajouté à PyPi.

  • pep8-Python style guide checker
  • pep8 est un outil pour vérifier votre code Python par rapport à certaines des conventions de style de PEP 8.

il est maintenant très facile de vérifier votre code par rapport à pep8.

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

92
répondu Rudiger Wolf 2017-03-13 13:46:55