2009-08-23 12 views
17

J'essaie de trouver un outil pour vérifier le style de codage en python.Outil pour appliquer le style/les normes de code python

Pour PHP j'ai vu il y a le Code Sniffer, et un petit perl script utilisé par Drupal. Existe-t-il un tel outil pour le code python?

+0

Je viens de trouver à propos de pep8.py, mais la page ne se charge pas. Cependant, il est toujours dans le cache Google http://74.125.93.132/search?q=cache:-sI5YpbDc9MJ:svn.browsershots.org/trunk/devtools/pep8/pep8.py+pep8.py Est-ce le seul outil? ? Y a-t-il un autre meilleur? – solarc

Répondre

35

Dans le passé, j'ai principalement utilisé PyLint - il peut mettre en évidence lorsque vous avez utilisé une variable non définie, lorsque vous importez des choses sans les utiliser et ainsi de suite. Il peut être un peu bavard, se plaignant de choses comme des lignes de plus de 80 caractères, des variables ne correspondant pas à des regex spécifiques, des classes ayant trop peu de méthodes publiques, des méthodes manquant de docs-trings.

Par exemple, pour le script ..

import os 
import somefakelib 

def myfunc(x): 
    blah = "Something" 
    print os.listdir(x+blh) 

pylint génère les messages suivants:

C: 1: Missing docstring 
F: 2: Unable to import 'somefakelib' (No module named somefakelib) 
C: 4:myfunc: Missing docstring 
C: 4:myfunc: Invalid name "x" (should match [a-z_][a-z0-9_]{2,30}$) 
C: 4:myfunc: Invalid name "x" (should match [a-z_][a-z0-9_]{2,30}$) 
E: 6:myfunc: Undefined variable 'blh' 
W: 5:myfunc: Unused variable 'blah' 
W: 2: Unused import somefakelib 

Ils sont toutes les plaintes valides, mais je tendance à désactiver un grand nombre de conventions et messages refactoring . Vous pouvez désactiver les messages spécifiques, que ce soit sous forme de commentaires dans votre code:

#pylint:disable-msg=R0903,C0103,R0903,F0401,C0301 

..ou comme arguments de ligne de commande à la commande pylint:

pylint --disable-msg=R0903,C0103,R0903,F0401,C0301 myfile.py 

Avec les messages ci-dessus désactivé, il génère les messages suivants pour le code ci-dessus:

C: 1: Missing docstring 
C: 4:myfunc: Missing docstring 
E: 6:myfunc: Undefined variable 'blh' 
W: 5:myfunc: Unused variable 'blah' 
W: 2: Unused import somefakelib 

pylint génère également un "rapport de code", y compris le nombre de lignes de code/commentaires/docstring/espaces blancs le fichier a, le nombre de messages par-c ategory, et donne à votre code un "score" - 10 étant aucun message, 0 étant généralement une erreur de syntaxe

Une autre option est PyFlakes, que je trouve un peu moins verbeuse (j'ai récemment commencé à l'utiliser en place de PyLint). Encore une fois en utilisant le script ci-dessus, pyflakes donne les messages suivants:

example.py:2: 'somefakelib' imported but unused 
example.py:6: undefined name 'blh' 

La dernière option que j'utilise est pep8.py, qui, comme son nom l'indique applique PEP8. C'est de loin le script le plus .. pédant, en imposant des choses comme des lignes blanches correctes avant/après les fonctions/classes, en espaçant le code, en corrigeant l'indentation à 4 espaces et ainsi de suite.

Fonctionnant sur le code ci-dessus, il produit les éléments suivants:

example.py:4:1: E302 expected 2 blank lines, found 1 
example.py:6:23: E201 whitespace after '(' 
example.py:6:32: W292 no newline at end of file 

Il est applique la plupart du temps des choses stylistiques comme correct des espaces, il ne fait pas beaucoup d'analyse statique du code comme pylint ou pyflakes, je Utilisez pep8.py conjointement avec PyLint ou PyFlakes.

pep8.py a été annoncé sur le python mailing list here, mais le lien de téléchargement dans c'est mort .. Il y a un miroir github par cburroughs, avec quelques corrections mineures à github.com/cburroughs/pep8.py, ou vous pouvez saisir la version non modifiée de an older revision

PyChecker est une autre option, bien que je ne l'utilise pas

+0

wow, bravo pour le temps pris pour l'explication – solarc

12

pylint et pyflakes serait un bon début.

pylint en particulier est très configurable, et vous pouvez appliquer un certain nombre de choses avec.

+0

Super, semble exactement ce que je cherche :) – solarc

+0

Lien vers pyflakes est cassé – Stefan

4

Trouvé cette question stackoverflow lors de la recherche d'un outil de mise en application de style pep8 lors de la prise en charge d'un projet existant (ancien).

https://github.com/hhatto/autopep8

autopep8 -i yourpythonsourcefile.py 

automagiquement convertir tout le code source pour confirmer avec pep8. Je l'ai essayé sur mon projet d'héritage et ça fonctionne très bien. J'ai donc pensé mettre à jour cette réponse ici dans SO.

Questions connexes