PyLint, PyChecker ou PyFlakes? [fermé]

390

J'aimerais avoir des commentaires sur ces outils sur:

  • traits;
  • adaptabilité;
  • facilité d'utilisation et courbe d'apprentissage.
e-satis
la source
1
quelle norme d'étiquette a à voir avec cela?
SilentGhost
2
Parce que vous utilisez ces outils pour faire correspondre PEP, en particulier PEP 8 qui est la norme pour tous les modules Python intégrés.
e-satis
et à quels autres peps voulez-vous qu'il corresponde? car pour pep-8, il existe une balise non ambiguë stackoverflow.com/questions/tagged/pep8
SilentGhost
Vous avez raison, je vais passer à pep8
e-satis
1
Le titre ne devrait-il pas être modifié pour inclure pep8 en option? Au début, je pensais que vous parliez de la proposition, pas d'un véritable package PyPI.
Ehtesh Choudhury

Réponses:

275

Bon, 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 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)

Par conséquent :

  • PyCheckerest 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.
  • PyFlakesest 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 y aller.
  • PyLint a été très bavard et a évalué le code 3/10 (OMG, je suis un sale codeur!).

Points forts de PyLint:

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

Contre PyLint:

  • Certaines règles sont vraiment strictes. Je sais que vous pouvez le changer et que la valeur par défaut est de faire correspondre PEP8, mais est-ce un tel crime d'écrire «pour x en seq»? Apparemment oui car vous ne pouvez pas écrire un nom de variable avec moins de 3 lettres. Je vais changer ça.
  • Très très bavard. Soyez prêt à utiliser vos yeux.

Script corrigé (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)

ÉDITER :

Grâce à Rudiger Wolf, j'ai découvert pep8que fait exactement ce que son nom suggère: assortir PEP8. Il a trouvé plusieurs syntax no-nos que PyLint n'a pas trouvés. Mais PyLintj'ai trouvé des trucs qui n'étaient pas spécifiquement liés au PEP8 mais intéressants. Les deux outils sont intéressants et complémentaires.

Finalement, je vais utiliser les deux car ils sont vraiment faciles à installer (via des packages ou setuptools) et le texte de sortie est si facile à enchaîner.

Pour vous donner une petite idée de leur sortie:

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
la source
18
Le but de pyflakes est d'analyser statiquement votre code pour vous assurer qu'il n'y aura pas d'erreurs de nom ou de variables / importations inutilisées.
culebrón
4
Suis-je en train de me tromper ou n'y a-t-il pas de point fort / faible pour PyChecker ni PyFlakes?
Wernight
17
"Points forts: rapport très descriptif et précis." Quel rapport? Cette section concerne-t-elle tous les outils ou un seul?
ijk
3
Je me demande. J'ai évidemment écrit tout le pour / contre seulement sur PyLint. Je n'ai aucune idée pourquoi j'ai écrit de cette manière stupide. La gueule de bois peut-être? Désolé les gars.
e-satis
13
flake8 couvre à la fois pyflakeset pep8. Le suggérer fortement plutôt que d'utiliser l'un ou l'autre.
Ehtesh Choudhury
93

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 super facile de vérifier votre code par rapport à pep8.

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

Rudiger Wolf
la source
57
Il y a un meilleur package IMO. flake8, il combine les deux et ajoute une complexité conditionnelle, fonctionne sur les répertoires et est généralement bon.
DinGODzilla
1
Courir flake8pour la première fois m'a appris que je me suis lancé directement dans un projet sans apprendre que Python préfère fortement les espaces pour une raison quelconque. J'ai dû utiliser --ignore W191pour rendre la sortie utile.
cjm
3
Notez que les versions récentes de pep8sont désormais appelées pycodestyle; voir pypi.org/project/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 au sein de la communauté est un grand avantage, et la communauté a décidé des espaces, alors faites-le.
Chris
Comment configurer au mieux mon éditeur (BBEdit ou vim) pour utiliser des espaces pour Python et des tabulations pour tout le reste? Il semble que (au moins pour BBEdit) c'est un paramètre global.
cjm
1
@cjm Dans vim, vous pouvez faire :set et(abréviation de expandtabs) puis :retabconvertir tous les onglets du tampon actuel en espaces. Il peut également être utile de ts=4 sts=4 sw=4( tabstop, softtabstop, shiftwidth) en premier. En ce qui concerne une approche générale, je préfère utiliser editorconfig.org et ses plugins pour définir les bons paramètres dans un référentiel, donc vous n'avez pas à vous soucier de reconfigurer votre éditeur pour différentes bases de code.
codermonkeyfuel