PyLint, PyChecker ou PyFlakes? [fermé]
Question
J'aimerais obtenir des commentaires sur ces outils sur:
- fonctionnalités;
- adaptabilité;
- facilité d'utilisation et courbe d'apprentissage.
La solution
Eh bien, je suis un peu curieux, alors je viens de tester les 3 moi-même juste après avoir posé la question ;-)
D'accord, ce n'est pas un commentaire très sérieux, mais voici ce que je peux dire:
J'ai essayé les outils avec les paramètres par défaut (il est important car vous pouvez très bien choisir vos règles de vérification) dans 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:
-
PyChecker
est gênant car il compile le module pour l’analyser. Si vous ne voulez pas que votre code soit exécuté (par exemple, il effectue une requête SQL), c'est mauvais. -
PyFlakes
est supposé être léger. En effet, il a décidé que le code était parfait. Je cherche quelque chose d'assez grave, donc je ne pense pas que je vais y aller. -
PyLint
a été très bavard et a attribué une note de 3/10 au code (OMG, je suis un sale codeur!).
Points forts de PyLint
:
- Rapport très descriptif et précis.
- Détectez 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 particulier. Quelque chose que je savais, mais que je n'aurais jamais espéré qu'un ordinateur me dise:
- Le code entièrement corrigé est exécuté plus rapidement (pas de classe, pas de liaison de référence ...).
- Fabriqué par une équipe française. Ok ce n’est pas un avantage pour tout le monde, mais j’aime bien ;-)
Contre de 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 dans seq»? Apparemment oui parce que vous ne pouvez 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.
Script corrigé (avec des chaînes de document paresseuses 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)
EDIT:
Grâce à Rudiger Wolf, j'ai découvert pep8
qui fait exactement ce que son nom suggère: faire correspondre le PEP8. Il a trouvé plusieurs syntaxes no-nos que PyLint n'a pas. Mais PyLint
a trouvé des éléments qui n'étaient pas spécifiquement liés à PEP8 mais intéressants. Les deux outils sont intéressants et complémentaires.
Finalement, je vais utiliser les deux car il est très facile à installer (via des paquets ou setuptools) et le texte de sortie est si facile à chaîner.
Pour vous donner une petite idée de leurs résultats:
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 |= |
+-------------------------+------+---------+-----------+
Autres conseils
pep8 a récemment été ajouté à PyPi.
- pep8 - Vérificateur de guide de style Python
- pep8 est un outil permettant de comparer votre code Python à certaines conventions de style de PEP 8.
Il est maintenant très facile de vérifier votre code contre pep8.