146 votes

Existe-t-il des outils d'analyse statique pour Python ?

Je commence à utiliser Python (notamment à cause de Django) et j'aimerais m'affranchir des tests exhaustifs en effectuant une analyse statique. Quels outils/paramètres/etc. existent pour détecter des problèmes au moment de la compilation qui, autrement, apparaîtraient au moment de l'exécution ? (les erreurs de type sont probablement le cas le plus évident de ceci, mais les variables non définies sont un autre gros problème qui pourrait être évité avec une analyse approfondie de l'AST).

Il est évident que les tests sont importants, et je ne veux pas dire que les tests peuvent être entièrement évités ; cependant, il y a beaucoup d'erreurs d'exécution dans python qui ne sont pas possibles dans d'autres langages qui effectuent une vérification d'exécution plus stricte -- j'espère qu'il existe des outils pour apporter au moins certaines de ces capacités à python également.

91voto

John Millikin Points 86775

pylint est le meilleur outil de ce type que j'ai trouvé. En raison de la nature de Python, il est difficile de l'analyser statiquement, mais il attrape les variables indéfinies, les erreurs de type de base, le code inutilisé, etc. Vous devrez modifier le fichier de configuration, car par défaut, il affiche de nombreux avertissements que je considère comme inutiles ou nuisibles.

Voici une partie de mon .pylintrc la gestion du silence des alertes :

# Brain-dead errors regarding standard language features
#   W0142 = *args and **kwargs support
#   W0403 = Relative imports

# Pointless whinging
#   R0201 = Method could be a function
#   W0212 = Accessing protected attribute of client class
#   W0613 = Unused argument
#   W0232 = Class has no __init__ method
#   R0903 = Too few public methods
#   C0301 = Line too long
#   R0913 = Too many arguments
#   C0103 = Invalid name
#   R0914 = Too many local variables

# PyLint's module importation is unreliable
#   F0401 = Unable to import module
#   W0402 = Uses of a deprecated module

# Already an error when wildcard imports are used
#   W0614 = Unused import from wildcard

# Sometimes disabled depending on how bad a module is
#   C0111 = Missing docstring

# Disable the message(s) with the given id(s).
disable-msg=W0142,W0403,R0201,W0212,W0613,W0232,R0903,W0614,C0111,C0301,R0913,C0103,F0401,W0402,R0914

81voto

rcreswick Points 6429

Voici mes premières impressions sur pyflakes, pychecker et pylint :

  • pychecker : Il se plante fréquemment, la plupart des exécutions que j'ai essayées ont donné lieu à des Erreurs provenant du code de pychecker (par exemple : AttributeError ou IndexError : list index out of range étaient les plus courantes). Pour une raison quelconque, j'ai dû définir la variable d'environnement DJANGO_SETTINGS_MODULE avant de pouvoir exécuter le code de l'application, et la documentation est très rare.

  • pyflakes : 'pyflakes --help' lance une TypeError -- erm... La documentation est également très rare, et pyflakes est très indulgent (pour autant que je puisse dire, il ne signale que les erreurs de compilation, les avertissements, les redéfinitions, et certains problèmes concernant les importations - comme les inutilisés et les jokers). pyflakes semble également se répéter :

    eventlist/views.py:4 : 'Http404' importé mais inutilisé
    eventlist/views.py:4 : 'Http404' importé mais inutilisé
    eventlist/views.py:5 : 'from eventlist.models import *' utilisé ; impossible de détecter les noms non définis eventlist/views.py:59 : 'authenticate' importé mais non utilisé
    eventlist/views.py:61 : redéfinition de l'inutilisé 'login' depuis ligne 59
    eventlist/views.py:5 : 'from eventlist.models import *' utilisé ; Impossible de détecter les noms indéfinis
    eventlist/views.py:4 : 'Http404' importé mais inutilisé

  • pylint : Cet outil semble être le plus performant des outils proposés. Il dispose de la meilleure documentation. LogiLab fournit un tutoriel, pylint a un écran d'aide, et il y a un lien (cassé) vers un manuel utilisateur, ce qui serait extrêmement utile. L'application de pylint à django pose quelques problèmes, car pylint ne connaît pas les classes de django (telles que models.Model). Cela signifie qu'un bon nombre d'erreurs, qui auraient pu être utiles, sont générées par des champs de classe manquants :

    E:105:get_events_by_tag : La classe 'Tag' n'a pas de membre 'objects'.

    L'analyse automatique de ces données sera très difficile sans une connaissance supplémentaire des classes utilisées. Je ne suis pas sûr qu'il soit possible d'ajouter cela, mais il semble probable que pylint soit capable de gérer cela de la "bonne" façon. (J'ai probablement juste besoin de le faire pointer vers la source de django, mais il n'y a pas de paramètres de ligne de commande qui semblent probables, et, comme mentionné précédemment, le manuel de l'utilisateur est inaccessible).

Pour l'instant, je m'intéresse toujours à pylint -- pychecker et pyflakes ont besoin d'une meilleure documentation et doivent devenir plus robustes.

13voto

cdleary Points 18869

Vous devriez vérifier Pyflakes , Pylint et PyChecker . J'ai personnellement utilisé Pyflakes et Pylint, et je les ai trouvés tous les deux très utiles pour attraper ces petites choses sur lesquelles vous détestez vous tromper. Pylint nécessite généralement un peu plus de configuration que Pyflakes.

A noter également : Le plugin PyDev d'Eclipse est doté d'un analyseur de sortie Pylint intégré.

9voto

andy boot Points 3270

Une bonne méthode simple que j'utilise est Flocon8 - Il combine PyFlakes et PEP8.

8voto

Dan Points 1582

Il y a

Et probablement d'autres aussi.

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