¿Cómo puedo analizar el código Python para identificar áreas problemáticas?

99

Tengo un gran repositorio de fuentes dividido en varios proyectos. Me gustaría producir un informe sobre la salud del código fuente, identificando áreas problemáticas que deben abordarse.

Específicamente, me gustaría mencionar rutinas con una alta complejidad ciclomática, identificar la repetición y tal vez ejecutar algún análisis estático similar a una pelusa para detectar construcciones sospechosas (y por lo tanto probablemente erróneas).

¿Cómo podría construir un informe de este tipo?

Jerub
fuente

Respuestas:

36

Para medir la complejidad ciclomática, hay una buena herramienta disponible en traceback.org . La página también ofrece una buena descripción general de cómo interpretar los resultados.

+1 para pilotaje . Es excelente para verificar la adherencia a los estándares de codificación (ya sea PEP8 o la variante de su propia organización), lo que al final puede ayudar a reducir la complejidad ciclomática.

Mike Griffith
fuente
4
traceback.org tiene un enlace roto
denfromufa
Pylint es genial, pero lento. Usamos como un gancho pre-push, pero usamos flake8 y un montón de complementos para verificaciones regulares y pre-compromiso. Sin https://flakehell.readthedocs.io/config.htmlembargo, lo recomendaría estos días, ya que su modelo de ejecución es mucho más robusto y configurable.
DylanYoung
29

Para la complejidad ciclomática puede usar radon: https://github.com/rubik/radon

(Uso pippara instalarlo: pip install radon)

Además también tiene estas características:

  • métricas sin procesar (que incluyen SLOC, líneas de comentarios, líneas en blanco, etc.)
  • Métricas de Halstead (todas)
  • Índice de mantenibilidad (el que se usa en Visual Studio)
Dave Halter
fuente
¿Cuál es el cambio para obtener métricas de Halstead?
Dima Tisnek
1
@qarma Si entiendo los documentos, no creo que puedas usar la línea de comando. Tienes que usar la API de Python.
Dave Halter
18

Para el análisis estático hay pylint y pychecker . Personalmente, uso pylint ya que parece ser más completo que pychecker.

Para la complejidad ciclomática, puede probar este programa en Perl o este artículo que presenta un programa en Python para hacer lo mismo.

espacio libre
fuente
11

¡Pycana funciona de maravilla cuando necesitas entender un nuevo proyecto!

PyCAna (Python Code Analyzer) es un nombre elegante para un analizador de código simple para Python que crea un diagrama de clases después de ejecutar su código.

Vea cómo funciona: http://pycana.sourceforge.net/

salida:

texto alternativo

msemelman
fuente
6

Use flake8 , que proporciona pep8, pyflakes y análisis de complejidad ciclomática en una sola herramienta

Wes Kendall
fuente
4

Existe una herramienta llamada CloneDigger que le ayuda a encontrar fragmentos de código similares.

Anónimo
fuente
1
No funciona con Python 3 y nunca se mantuvo bien.
Acumenus
3

Para comprobar la complejidad ciclomática, por supuesto, existe el mccabepaquete.

Instalación:

$ pip install --upgrade mccabe

Uso:

$ python -m mccabe --min=6 path/to/myfile.py

Tenga en cuenta el umbral de 6 anterior. Según esta respuesta , las puntuaciones> 5 probablemente deberían simplificarse.

Salida de muestra con --min=3:

68:1: 'Fetcher.fetch' 3
48:1: 'Fetcher._read_dom_tag' 3
103:1: 'main' 3

Opcionalmente, también se puede utilizar a través de pylint-mccabe o pytest-mccabe , etc.

Acumenus
fuente