146 votos

¿Hay cualquier herramienta de análisis estático para Python?

Estoy empezando a usar Python (específicamente porque de Django) y me gustaría quitar la carga de un exhaustivo proceso de pruebas mediante la realización de algunos análisis estático. ¿Qué herramientas/parámetros de/etc. existen para detectar problemas en tiempo de compilación que de lo contrario se muestran durante el tiempo de ejecución? (tipo de errores son, probablemente, el caso más obvio de esto, pero sin definir variables son el otro gran tema que podría ser evitado con un análisis en profundidad de la AST.)

Obviamente, la prueba es importante, y yo no implican que las pruebas pueden ser obviado por completo; sin embargo, hay muchos errores de tiempo de ejecución de python que no son posibles en otros idiomas que realizar más estrictas de tiempo de ejecución de la comprobación -- tengo la esperanza de que hay herramientas para que llevar al menos algunas de estas capacidades para python así.

91voto

John Millikin Puntos 86775

pylint es la mejor herramienta tan he encontrado. Debido a la naturaleza de Python es difícil analizarlo estáticamente, pero lo atrapará variables indefinidas, errores de tipo básico, sin usar código, etc.. Usted querrá modificar el archivo de configuración, como por defecto imprime muchas advertencias que considero inútiles o perjudiciales.

Esto es parte de mi .pylintrc tratan de silenciar a ADVERTENCIA:

# 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 Puntos 6429

Aquí están mis primeras impresiones de pyflakes, pychecker y pylint:

  • pychecker: se bloquea con frecuencia, la mayoría de las pistas traté de resultado en los Errores que se originó en el pychecker código (por ejemplo: AttributeError o IndexError: list index out of range eran los más comunes). Por alguna razón había para establecer el DJANGO_SETTINGS_MODULE variable de entorno antes de que incluso podría ejecutarse en cualquiera de los código de la aplicación, y la documentación es muy escasa.

  • pyflakes: 'pyflakes --help' tira un TypeError-erm... la Documentación también es muy escasa, y pyflakes es muy indulgente (como lo que yo puedo decir, que sólo informa de los errores de compilación, advertencias, redefiniciones, y algunas preocupaciones acerca de las importaciones, tales como y sin usar comodines). pyflakes parece que también se repite a sí misma:

    eventlist/views.py:4: 'Http404' importados, pero sin utilizar
    eventlist/views.py:4: 'Http404' importados, pero sin utilizar
    eventlist/views.py:5: " de eventlist.models de importación *' utilizado; incapaz de detectar indefinido nombres eventlist/views.py:59: 'autenticar " importado pero no utilizados
    eventlist/views.py:61: redefinición de los 'login' de línea 59
    eventlist/views.py:5: " de eventlist.models de importación *' utilizado; incapaz de detectar indefinido nombres
    eventlist/views.py:4: 'Http404' importados, pero sin utilizar

  • pylint: Este parece ser el más capaz de los instrumentos propuestos. Tiene la mejor documentación. LogiLab proporciona un tutorial, pylint tiene una pantalla de ayuda, y hay una (roto) enlace a un manual de usuario, lo que sería extremadamente útil. Hay algunos problemas con la aplicación de pylint a django, desde pylint no sabe acerca de la django clases (como models.Model). Esto significa que un buen número de otro modo valioso de los errores se generan acerca de la falta de campos de la clase. por ejemplo:

    E:105:get_events_by_tag: Clase 'Tag' no tiene 'objetos' miembro

    El análisis de estas automáticamente será muy difícil sin algunos conocimientos adicionales de las clases en uso. No estoy seguro de que la adición de que es factible, pero que no parece probable que pylint es capaz de lidiar con esto en la manera "correcta". (Probablemente sólo necesita a punto para el django de origen, pero no hay ninguna línea de comandos parámetros que parece probable, y, como se mencionó anteriormente, el manual de usuario es inaccesible.)

Por el momento, todavía estoy buscando en pylint -- pychecker y pyflakes necesidad de una mejor documentación y que necesitan para ser más robusto.

13voto

cdleary Puntos 18869

Usted debe comprobar fuera de Pyflakes, Pylint, y PyChecker. Yo personalmente he utilizado tanto Pyflakes y Pylint, y los encontré tanto a ser muy útil para la captura de esas pequeñas cosas que odio al lío. Pylint generalmente requiere un poco más de configuración de Pyflakes.

También digno de mención: Eclipse plugin PyDev viene con un sistema incorporado en la Pylint de salida del analizador.

8voto

Dan Puntos 1582

Hay

Y probablemente otros, también.

7voto

Dmitry Shachnev Puntos 332

Este artículo es una gran comparación de analizadores de código Python ( pylint , pychecker y pyflakes ).

Además, si utiliza Debian y están familiarizados con Lintian, puedes echar un vistazo en lintian4python .

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X