Mejoras de la calidad del código escrito en Python

La automatización de la comprobación de la calidad del código es importante porque:
  • Una máquina es más rápida y más precisa que un humano.
  • Es fácil agregar nuevos checks.
  • El código debe pasar las comprobaciones antes de ser mergeado.
  • Mejora el ciclo de revisión acelerándolo y simplificándolo 
Cualquier tarea de automatización requiere, por definición, uso de herramientas. En este caso hablaremos de flake8, pylint y coverage

flake8

Es básicamente un wrapper de pycodestyle, pyflakes y mccabe.

Instalación

pip install flake8

Uso

flake8 my_module.py
o
flake8 my_package.py/

Componentes

pycodestyle: verifica compatibilidad con pep8 y usos no idiomáticos.
Por ej:
  • Múltiples espacios antes de un operador 
  • Ningún espacio alrededor de un operador
  • Comparaciones con valores booleanos del tipo "if a == True" 

pyflakes: no mira el estilo pero busca bugs y tiene una baja probabilidad de falsos positivos.
Por ej:
  • Paquetes importados y no usados.
  • Variables locales asignadas y no usadas. 
  • Nombres indefinidos.
mccabe: mide la complejidad de Mccabe de la solución. Como regla de oro, no debería sobrepasarse el valor 10 como complejidad máxima.

pylint

Hace un uso más estricto y "controversial" de pep8 pero permite configurar que mensajes de error no mostrar, por ej., explicitamente que pensás que podrían ser buenos nombres de variables aunque pylint lo desaconseje.

Instalación

pip install pylint

Uso

pylint my_module.py
pylint my_package.py/

pylint vs flake8

Aspectos comunes:
  • Uso de plugins. 
  • Configuración. 
  • Comprobaciones: PEP 8, imports no usados, sentencias no idiomáticas, referenciación de variables 

Características de pylint:
  • Lento
  • Comprobaciones: nombres, patrones peligrosos, DRY, detección de errores más estricta, máximos (métodos, argumentos, etc).

Características de flake8:
  • Rápido
  • Comprobaciones: espacios en blanco y complejidad de McCabe

coverage

Calcula el porcentaje del código que está cubierto por tests. Genera un reporte con las líneas que no fueron testeadas o, si no lo fue una determinada línea de cierta branch en particular

Instalación

pip install coverage
o
pip install pytest-cov si se lo usará como plugin de pytest.

Otras herramientas

  • mypy: analizador estático de tipos
  • doc8: busca el correcto uso de docstrings
Esta entrada es un resumen de la charla "Automating Code Quality" de Kyle Knapp en PyCon18.

Comentarios

Entradas populares de este blog

Introduccion a x86 ASM - Registros

JS: Triángulo de Pascal

Legacy Trash (II)