2009-08-23 9 views
17

Estoy tratando de encontrar una herramienta para verificar el estilo de codificación en python.Herramienta para aplicar estilo/estándares de código python

Para PHP He visto que hay Code Sniffer, y un pequeño perl script utilizado por Drupal. ¿Hay tal herramienta para el código python?

+0

Acabo de encontrar pep8.py, pero la página no se carga. Sin embargo, todavía está en el caché de Google http://74.125.93.132/search?q=cache:-sI5YpbDc9MJ:svn.browsershots.org/trunk/devtools/pep8/pep8.py+pep8.py Es la única herramienta ? ¿Hay algún otro mejor? – solarc

Respuesta

35

En el pasado he utilizado principalmente PyLint - se puede resaltar cuando se usa una variable indefinida, cuando se importan cosas sin usarlas, etc.

Puede ser un poco detallado, quejándose de cosas como líneas de más de 80 caracteres, variables que no coinciden con expresiones específicas, clases que tienen muy pocos métodos públicos, métodos que faltan documentos-trings.

Por ejemplo, para el script ..

import os 
import somefakelib 

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

pylint genera los siguientes mensajes:

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 

Son todas las quejas válidas, pero tienden a desactivar muchos de los mensajes de convenciones y refactorización . Puede desactivar los mensajes específicos, ya sea como comentarios en el código:

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

..o como argumentos de línea de comandos en la pylint:

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

Con los mensajes anteriores desactivadas, genera los siguientes mensajes para el código anterior:

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 también genera un "informe de códigos", incluyendo el número de líneas de código/comentarios/docstring/espacio en blanco el archivo tiene, número de mensajes por-c una categoría, y le da a su código un "puntaje" - 10 no es ningún mensaje, 0 generalmente es un error de sintaxis

Otra opción es PyFlakes, que me parece un poco menos excesivamente prolija (recientemente comencé a usarlo en su lugar de PyLint). De nuevo usando la secuencia de comandos, pyflakes da los siguientes mensajes:

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

La última opción que utilizo es pep8.py, que como su nombre indica hace cumplir PEP8. Es, con mucho, la escritura más pedante, que impone cosas como las líneas en blanco correctas antes/después de las funciones/clases, el espaciado del código, la correcta sangría de 4 espacios, etc.

se ejecutan en el código anterior, se produce lo siguiente:

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 

En su mayoría se impone cosas estilísticas como espacios en blanco correcto, no hace mucho a la electricidad estática análisis del código como pylint o pyflakes, por lo que usa pep8.py junto con PyLint o PyFlakes.

pep8.py se anunció originalmente en el python mailing list here, pero el enlace de descarga en este ahora está muerto .. Hay un espejo GitHub por cburroughs, con algunas correcciones menores en github.com/cburroughs/pep8.py, o se puede agarrar la versión sin modificar del an older revision

PyChecker es otra opción, aunque no lo he usado

+0

wow, felicitaciones por el tiempo empleado en la explicación – solarc

12

pylint y pyflakes sería un buen comienzo.

pylint, en particular, es muy configurable, y puede aplicar bastantes cosas con él.

+0

Genial, parece exactamente lo que estoy buscando :) – solarc

+0

El enlace a los copos se ha roto – Stefan

4

Encontré esta pregunta de stackoverflow mientras buscaba una herramienta de cumplimiento de estilo pep8 cuando asumía un proyecto existente (heredado).

https://github.com/hhatto/autopep8

autopep8 -i yourpythonsourcefile.py 

convertirá automagicamente todo el código fuente para confirmar con PEP8. Lo intenté en mi proyecto heredado y funciona muy bien. Así que pensé que actualizaría esta respuesta aquí en SO.

Cuestiones relacionadas