406 votes

Pylint, PyChecker ou PyFlakes ?

J'aimerais avoir un retour d'information sur ces outils :

  • caractéristiques ;
  • l'adaptabilité ;
  • la facilité d'utilisation et la courbe d'apprentissage.

1 votes

Quel est le rapport entre la norme d'étiquetage et ceci ?

2 votes

Parce que vous utilisez ces outils pour correspondre aux PEP, en particulier la PEP 8 qui est la norme pour tous les modules Python intégrés.

0 votes

Et à quels autres peps voulez-vous qu'il corresponde ? parce que pour pep-8 il y a un tag sans ambiguïté stackoverflow.com/questions/tagged/pep8

292voto

e-satis Points 146299

Eh bien, je suis un peu curieux, alors j'ai testé les trois moi-même juste après avoir posé la question ;-)

Ok, ce n'est pas une critique très sérieuse, mais voici ce que je peux dire :

J'ai essayé les outils avec les paramètres par défaut (c'est important car 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)

En conséquence :

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

Points forts de PyLint :

  • Rapport très descriptif et précis.
  • Détecter quelques 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. C'est quelque chose que je savais, mais je ne m'attendais pas à ce qu'un ordinateur me le dise :-p
  • Le code entièrement corrigé s'exécute plus rapidement (pas de classe, pas de liaison de référence...).
  • Fabriqué par une équipe française. OK, ce n'est pas un plus pour tout le monde, mais moi j'aime bien ;-)

Contre de Pylint :

  • Certaines règles sont très strictes. Je sais que vous pouvez les modifier et que la valeur par défaut correspond à PEP8, mais est-ce un crime d'écrire "for x in seq" ? Apparemment oui, car on ne peut pas écrire un nom de variable avec moins de 3 lettres. Je vais changer cela.
  • Très très bavard. Soyez prêt à utiliser vos yeux.

Correction de script (avec des chaînes de doc paresseux et des 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)

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

Finalement, j'utiliserai les deux car ils sont vraiment faciles à installer (via les packages ou les 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    |=          |
+-------------------------+------+---------+-----------+

18 votes

Le but de pyflakes est d'analyser statiquement votre code pour s'assurer qu'il n'y aura pas d'erreurs de nom ou de variables/importations inutilisées.

4 votes

Est-ce que je me trompe ou n'y a-t-il pas de point fort/faible pour PyChecker ou PyFlakes ?

1 votes

Les points forts/faibles de PyChecker et PyFlakes sont donnés ici : s

95voto

Rudiger Wolf Points 1053

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

  • pep8 - Vérificateur de guide de style Python
  • 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.

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

59 votes

Il existe un meilleur paquet IMO. flake8 il combine les deux et ajoute une complexité conditionnelle, fonctionne sur les répertoires et est généralement bon.

1 votes

Running flake8 pour la première fois m'a appris que je me suis lancé dans un projet sans apprendre que Python préfère fortement les espaces pour une raison quelconque. J'ai dû utiliser --ignore W191 pour rendre la sortie utile.

4 votes

Notez que les versions récentes de pep8 s'appellent désormais pycodestyle ; voir pypi.org/projet/pycodestyle @cjm : python préfère fortement les espaces car c'est ce qui est spécifié par les directives de style. Les espaces ne sont pas nécessairement supérieurs, mais la cohérence à travers la communauté est un grand avantage, et la communauté a décidé des espaces, alors faites-le.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X