Análisis estático del código fuente en Python
Análisis estático del código fuente en Python Pylint
Milton Mazzarri
Marzo, 2010
Análisis estático del código fuente en Python
Contenido I 1
Conceptos Análisis estático de código Pylint
2
Consideraciones Labores de revisión manual Falsos positivos
3
Revisiones Básicas Variables Clases Diseño Importaciones Conflictos de estilos Formato
Análisis estático del código fuente en Python
Contenido II Otras revisiones 4
Reportes
5
Puntuación
6
Proceso de corrección Instalación Ejecución Conociendo el detalle del error Primer avance Segundo avance
Análisis estático del código fuente en Python Conceptos Análisis estático de código
¿Análisis estático de código?
Definición El análisis estático del código se refiere al proceso de evaluación del código fuente sin ejecutarlo, en base a este análisis se obtendrá información que nos permita mejorar la línea base de nuestro proyecto, sin alterar la semántica original de la aplicación.
Análisis estático del código fuente en Python Conceptos Pylint
¿Qué es Pylint?
Definición Su misión es analizar código en Python en busca de errores o síntomas de mala calidad en el código fuente. Cabe destacar que por omisión, la guía de estilo a la que se trata de apegar Pylint es la descrita en el PEP-8.
Análisis estático del código fuente en Python Consideraciones Labores de revisión manual
Labores de revisión manual
Pylint no sustituye las labores de revisión continua de alto nivel: Estructura. Arquitectura. Comunicación con elementos externos como bibliotecas. Diseño.
Análisis estático del código fuente en Python Consideraciones Labores de revisión manual
Labores de revisión manual
Pylint no sustituye las labores de revisión continua de alto nivel: Estructura. Arquitectura. Comunicación con elementos externos como bibliotecas. Diseño.
Análisis estático del código fuente en Python Consideraciones Labores de revisión manual
Labores de revisión manual
Pylint no sustituye las labores de revisión continua de alto nivel: Estructura. Arquitectura. Comunicación con elementos externos como bibliotecas. Diseño.
Análisis estático del código fuente en Python Consideraciones Labores de revisión manual
Labores de revisión manual
Pylint no sustituye las labores de revisión continua de alto nivel: Estructura. Arquitectura. Comunicación con elementos externos como bibliotecas. Diseño.
Análisis estático del código fuente en Python Consideraciones Labores de revisión manual
Labores de revisión manual
Pylint no sustituye las labores de revisión continua de alto nivel: Estructura. Arquitectura. Comunicación con elementos externos como bibliotecas. Diseño.
Análisis estático del código fuente en Python Consideraciones Falsos positivos
Falsos positivos
Pylint puede arrojar falsos positivos Puede entenderse al recibir una alerta de algún cambio que usted realizó conscientemente. Algunas de las advertencias encontradas pueden ser peligrosas en algunos contextos, pero en otros puede no aplicar. Se hacen revisiones de declaraciones que a usted realmente no le importan.
Informe al revisor para ajustar la configuración de Pylint para no ser informado acerca de ciertos tipos de advertencias o errores.
Análisis estático del código fuente en Python Consideraciones Falsos positivos
Falsos positivos
Pylint puede arrojar falsos positivos Puede entenderse al recibir una alerta de algún cambio que usted realizó conscientemente. Algunas de las advertencias encontradas pueden ser peligrosas en algunos contextos, pero en otros puede no aplicar. Se hacen revisiones de declaraciones que a usted realmente no le importan.
Informe al revisor para ajustar la configuración de Pylint para no ser informado acerca de ciertos tipos de advertencias o errores.
Análisis estático del código fuente en Python Consideraciones Falsos positivos
Falsos positivos
Pylint puede arrojar falsos positivos Puede entenderse al recibir una alerta de algún cambio que usted realizó conscientemente. Algunas de las advertencias encontradas pueden ser peligrosas en algunos contextos, pero en otros puede no aplicar. Se hacen revisiones de declaraciones que a usted realmente no le importan.
Informe al revisor para ajustar la configuración de Pylint para no ser informado acerca de ciertos tipos de advertencias o errores.
Análisis estático del código fuente en Python Consideraciones Falsos positivos
Falsos positivos
Pylint puede arrojar falsos positivos Puede entenderse al recibir una alerta de algún cambio que usted realizó conscientemente. Algunas de las advertencias encontradas pueden ser peligrosas en algunos contextos, pero en otros puede no aplicar. Se hacen revisiones de declaraciones que a usted realmente no le importan.
Informe al revisor para ajustar la configuración de Pylint para no ser informado acerca de ciertos tipos de advertencias o errores.
Análisis estático del código fuente en Python Consideraciones Falsos positivos
Falsos positivos
Pylint puede arrojar falsos positivos Puede entenderse al recibir una alerta de algún cambio que usted realizó conscientemente. Algunas de las advertencias encontradas pueden ser peligrosas en algunos contextos, pero en otros puede no aplicar. Se hacen revisiones de declaraciones que a usted realmente no le importan.
Informe al revisor para ajustar la configuración de Pylint para no ser informado acerca de ciertos tipos de advertencias o errores.
Análisis estático del código fuente en Python Revisiones Básicas
Revisiones básicas
Presencia de cadenas de documentación (docstring). Nombres de módulos, clases, funciones, métodos, argumentos, variables. Número de argumentos, variables locales, retornos y sentencias en funciones y métodos. Atributos requeridos para módulos. Valores por omisión no recomendados como argumentos. Redefinición de funciones, métodos, clases. Uso de declaraciones globales.
Análisis estático del código fuente en Python Revisiones Básicas
Revisiones básicas
Presencia de cadenas de documentación (docstring). Nombres de módulos, clases, funciones, métodos, argumentos, variables. Número de argumentos, variables locales, retornos y sentencias en funciones y métodos. Atributos requeridos para módulos. Valores por omisión no recomendados como argumentos. Redefinición de funciones, métodos, clases. Uso de declaraciones globales.
Análisis estático del código fuente en Python Revisiones Básicas
Revisiones básicas
Presencia de cadenas de documentación (docstring). Nombres de módulos, clases, funciones, métodos, argumentos, variables. Número de argumentos, variables locales, retornos y sentencias en funciones y métodos. Atributos requeridos para módulos. Valores por omisión no recomendados como argumentos. Redefinición de funciones, métodos, clases. Uso de declaraciones globales.
Análisis estático del código fuente en Python Revisiones Básicas
Revisiones básicas
Presencia de cadenas de documentación (docstring). Nombres de módulos, clases, funciones, métodos, argumentos, variables. Número de argumentos, variables locales, retornos y sentencias en funciones y métodos. Atributos requeridos para módulos. Valores por omisión no recomendados como argumentos. Redefinición de funciones, métodos, clases. Uso de declaraciones globales.
Análisis estático del código fuente en Python Revisiones Básicas
Revisiones básicas
Presencia de cadenas de documentación (docstring). Nombres de módulos, clases, funciones, métodos, argumentos, variables. Número de argumentos, variables locales, retornos y sentencias en funciones y métodos. Atributos requeridos para módulos. Valores por omisión no recomendados como argumentos. Redefinición de funciones, métodos, clases. Uso de declaraciones globales.
Análisis estático del código fuente en Python Revisiones Básicas
Revisiones básicas
Presencia de cadenas de documentación (docstring). Nombres de módulos, clases, funciones, métodos, argumentos, variables. Número de argumentos, variables locales, retornos y sentencias en funciones y métodos. Atributos requeridos para módulos. Valores por omisión no recomendados como argumentos. Redefinición de funciones, métodos, clases. Uso de declaraciones globales.
Análisis estático del código fuente en Python Revisiones Básicas
Revisiones básicas
Presencia de cadenas de documentación (docstring). Nombres de módulos, clases, funciones, métodos, argumentos, variables. Número de argumentos, variables locales, retornos y sentencias en funciones y métodos. Atributos requeridos para módulos. Valores por omisión no recomendados como argumentos. Redefinición de funciones, métodos, clases. Uso de declaraciones globales.
Análisis estático del código fuente en Python Revisiones Variables
Revisión de variables
Determina si una variable o import no está siendo usado. Variables indefinidas. Redefinición de variables proveniente de módulos builtins o de ámbito externo. Uso de una variable antes de asignación de valor.
Análisis estático del código fuente en Python Revisiones Variables
Revisión de variables
Determina si una variable o import no está siendo usado. Variables indefinidas. Redefinición de variables proveniente de módulos builtins o de ámbito externo. Uso de una variable antes de asignación de valor.
Análisis estático del código fuente en Python Revisiones Variables
Revisión de variables
Determina si una variable o import no está siendo usado. Variables indefinidas. Redefinición de variables proveniente de módulos builtins o de ámbito externo. Uso de una variable antes de asignación de valor.
Análisis estático del código fuente en Python Revisiones Variables
Revisión de variables
Determina si una variable o import no está siendo usado. Variables indefinidas. Redefinición de variables proveniente de módulos builtins o de ámbito externo. Uso de una variable antes de asignación de valor.
Análisis estático del código fuente en Python Revisiones Clases
Revisión de clases
Métodos sin self como primer argumento. Acceso único a miembros existentes vía self Atributos no definidos en el método __init__ Código inalcanzable.
Análisis estático del código fuente en Python Revisiones Clases
Revisión de clases
Métodos sin self como primer argumento. Acceso único a miembros existentes vía self Atributos no definidos en el método __init__ Código inalcanzable.
Análisis estático del código fuente en Python Revisiones Clases
Revisión de clases
Métodos sin self como primer argumento. Acceso único a miembros existentes vía self Atributos no definidos en el método __init__ Código inalcanzable.
Análisis estático del código fuente en Python Revisiones Clases
Revisión de clases
Métodos sin self como primer argumento. Acceso único a miembros existentes vía self Atributos no definidos en el método __init__ Código inalcanzable.
Análisis estático del código fuente en Python Revisiones Diseño
Revisión de diseño
Número de métodos, atributos, variables locales, . . . Tamaño, complejidad de funciones, métodos, . . .
Análisis estático del código fuente en Python Revisiones Diseño
Revisión de diseño
Número de métodos, atributos, variables locales, . . . Tamaño, complejidad de funciones, métodos, . . .
Análisis estático del código fuente en Python Revisiones Importaciones
Revisión de importaciones
Dependencias externas. imports relativos o importe de todos los métodos, variables vía * (wildcard). Uso de imports cíclicos. Uso de módulos obsoletos.
Análisis estático del código fuente en Python Revisiones Importaciones
Revisión de importaciones
Dependencias externas. imports relativos o importe de todos los métodos, variables vía * (wildcard). Uso de imports cíclicos. Uso de módulos obsoletos.
Análisis estático del código fuente en Python Revisiones Importaciones
Revisión de importaciones
Dependencias externas. imports relativos o importe de todos los métodos, variables vía * (wildcard). Uso de imports cíclicos. Uso de módulos obsoletos.
Análisis estático del código fuente en Python Revisiones Importaciones
Revisión de importaciones
Dependencias externas. imports relativos o importe de todos los métodos, variables vía * (wildcard). Uso de imports cíclicos. Uso de módulos obsoletos.
Análisis estático del código fuente en Python Revisiones Conflictos de estilos
Conflictos entre viejo/nuevo estilo
Uso de property, __slots__, super. Uso de super.
Análisis estático del código fuente en Python Revisiones Conflictos de estilos
Conflictos entre viejo/nuevo estilo
Uso de property, __slots__, super. Uso de super.
Análisis estático del código fuente en Python Revisiones Formato
Revisiones de formato
Construcciones no autorizadas Sangrado estricto del código Longitud de la línea Uso de <> en vez de !=
Análisis estático del código fuente en Python Revisiones Formato
Revisiones de formato
Construcciones no autorizadas Sangrado estricto del código Longitud de la línea Uso de <> en vez de !=
Análisis estático del código fuente en Python Revisiones Formato
Revisiones de formato
Construcciones no autorizadas Sangrado estricto del código Longitud de la línea Uso de <> en vez de !=
Análisis estático del código fuente en Python Revisiones Formato
Revisiones de formato
Construcciones no autorizadas Sangrado estricto del código Longitud de la línea Uso de <> en vez de !=
Análisis estático del código fuente en Python Revisiones Otras revisiones
Otras revisiones
Notas de alerta en el código como FIXME, XXX. Código fuente con caracteres non-ASCII sin tener una declaración de encoding. PEP-263 Búsqueda por similitudes o duplicación en el código fuente. Revisión de excepciones. Revisiones de tipo haciendo uso de inferencia de tipos.
Análisis estático del código fuente en Python Revisiones Otras revisiones
Otras revisiones
Notas de alerta en el código como FIXME, XXX. Código fuente con caracteres non-ASCII sin tener una declaración de encoding. PEP-263 Búsqueda por similitudes o duplicación en el código fuente. Revisión de excepciones. Revisiones de tipo haciendo uso de inferencia de tipos.
Análisis estático del código fuente en Python Revisiones Otras revisiones
Otras revisiones
Notas de alerta en el código como FIXME, XXX. Código fuente con caracteres non-ASCII sin tener una declaración de encoding. PEP-263 Búsqueda por similitudes o duplicación en el código fuente. Revisión de excepciones. Revisiones de tipo haciendo uso de inferencia de tipos.
Análisis estático del código fuente en Python Revisiones Otras revisiones
Otras revisiones
Notas de alerta en el código como FIXME, XXX. Código fuente con caracteres non-ASCII sin tener una declaración de encoding. PEP-263 Búsqueda por similitudes o duplicación en el código fuente. Revisión de excepciones. Revisiones de tipo haciendo uso de inferencia de tipos.
Análisis estático del código fuente en Python Revisiones Otras revisiones
Otras revisiones
Notas de alerta en el código como FIXME, XXX. Código fuente con caracteres non-ASCII sin tener una declaración de encoding. PEP-263 Búsqueda por similitudes o duplicación en el código fuente. Revisión de excepciones. Revisiones de tipo haciendo uso de inferencia de tipos.
Análisis estático del código fuente en Python Reportes
Reportes
Posterior a los mensajes de análisis mostrados, Pylint despliega una serie de reportes, cada uno de ellos enfocándose en un aspecto particular del proyecto, como el número de mensajes por categorias, dependencias de módulos, . . .
Análisis estático del código fuente en Python Reportes
Número de módulos procesados
Ejemplo Report ====== 1895 statements analysed.
Análisis estático del código fuente en Python Reportes
Duplicación de código fuente
nb duplicated lines percent duplicated lines
now 274 5.591
previous NC NC
difference NC NC
Análisis estático del código fuente en Python Reportes
Estadísticas por tipo
type module class method function
number 14 12 145 1
%documented 85.71 100.00 85.52 100.00
%badname 57.14 66.67 83.45 0.00
Análisis estático del código fuente en Python Reportes
Errores y advertencias por módulo
module tests.test_cheese tests.test_spam tests.test_main tests.test_eggs tests.test_ham tests.common
error 75.00 25.00 0.00 0.00 0.00 0.00
warning 1.93 1.86 78.97 2.35 1.89 1.86
refactor 9.09 4.55 33.33 4.55 4.55 9.09
convention 20.48 27.01 4.17 28.94 4.11 3.56
Análisis estático del código fuente en Python Reportes
Número de mensajes por categorías
type convention refactor warning error
number 1655 66 28339 4
previous NC NC NC NC
difference NC NC NC NC
Análisis estático del código fuente en Python Reportes
Tipos de categorías de los mensajes
Refactorización Violación en alguna buena práctica. Convención Violación al estándar de codificación. Advertencia Problemas de estilo o errores de programación menores. Error Errores de programación importantes, es probable que se trate de un bug. Fatal Errores que no permiten a Pylint avanzar en su análisis.
Análisis estático del código fuente en Python Reportes
Tipos de categorías de los mensajes
Refactorización Violación en alguna buena práctica. Convención Violación al estándar de codificación. Advertencia Problemas de estilo o errores de programación menores. Error Errores de programación importantes, es probable que se trate de un bug. Fatal Errores que no permiten a Pylint avanzar en su análisis.
Análisis estático del código fuente en Python Reportes
Tipos de categorías de los mensajes
Refactorización Violación en alguna buena práctica. Convención Violación al estándar de codificación. Advertencia Problemas de estilo o errores de programación menores. Error Errores de programación importantes, es probable que se trate de un bug. Fatal Errores que no permiten a Pylint avanzar en su análisis.
Análisis estático del código fuente en Python Reportes
Tipos de categorías de los mensajes
Refactorización Violación en alguna buena práctica. Convención Violación al estándar de codificación. Advertencia Problemas de estilo o errores de programación menores. Error Errores de programación importantes, es probable que se trate de un bug. Fatal Errores que no permiten a Pylint avanzar en su análisis.
Análisis estático del código fuente en Python Reportes
Tipos de categorías de los mensajes
Refactorización Violación en alguna buena práctica. Convención Violación al estándar de codificación. Advertencia Problemas de estilo o errores de programación menores. Error Errores de programación importantes, es probable que se trate de un bug. Fatal Errores que no permiten a Pylint avanzar en su análisis.
Análisis estático del código fuente en Python Reportes
Formato de salida
El formato de salida del ejemplo utilizado está en modo texto, usted puede elegir entre: Coloreado Texto MSVS (Visual Studio) HTML.
Análisis estático del código fuente en Python Reportes
Formato de salida
El formato de salida del ejemplo utilizado está en modo texto, usted puede elegir entre: Coloreado Texto MSVS (Visual Studio) HTML.
Análisis estático del código fuente en Python Reportes
Formato de salida
El formato de salida del ejemplo utilizado está en modo texto, usted puede elegir entre: Coloreado Texto MSVS (Visual Studio) HTML.
Análisis estático del código fuente en Python Reportes
Formato de salida
El formato de salida del ejemplo utilizado está en modo texto, usted puede elegir entre: Coloreado Texto MSVS (Visual Studio) HTML.
Análisis estático del código fuente en Python Reportes
Total de ocurrencias de errores
El reporte ordena los resultados por el id del mensaje. message id occurences W0612 11010 W0621 10837 W0614 6169 C0301 1133 C0103 346 W0105 103 C0324 100
Análisis estático del código fuente en Python Puntuación
Puntuación
Si usted ejecuta Pylint varias veces sobre el mismo código, podrá ver el puntaje de la corrida previa junto al resultado de la corrida actual, de esta manera puede saber si ha mejorado la calidad de su código o no. Ejemplo Global evaluation ----------Your code has been rated at -148.73/10 You have to do something quick !
Análisis estático del código fuente en Python Proceso de corrección Instalación
Instalación en Debian GNU/Linux
Ejemplo # aptitude install pylint $ pylint -version pylint 0.19.0, astng 0.19.3, common 0.48.1 Python 2.5.5 (r255:77872, Mar 16 2010, 01:44:35) [GCC 4.4.3]
Análisis estático del código fuente en Python Proceso de corrección Ejecución
Ejecución de Pylint
Ejemplo $ cd montecarlo $ export PYTHONPATH=$PWD $ pylint -rcfile=pylintrc -f html -files-output=y scia/tests/
El resumen del reporte lo podrá encontrar en pylint_global.html.
Análisis estático del código fuente en Python Proceso de corrección Conociendo el detalle del error
Conozca que produjo el error
Ejemplo $ pylint -help-msg=W0612 :W0612: *Unused variable %r* Used when a variable is defined but not used. This message belongs to the variables checker.
Análisis estático del código fuente en Python Proceso de corrección Conociendo el detalle del error
Se ha encontrado la falla
Ejemplo # scia.tests.test_main.py def test_ham(self): from scia.tests.common import * cheese = TestSpam(self.main, self.delayKey, ... cheese.test_spam_method()
Análisis estático del código fuente en Python Proceso de corrección Conociendo el detalle del error
Se corrige la falla
Ejemplo # scia.tests.test_main.py def test_ham(self): from scia.tests.common import TestSpam cheese = TestSpam(self.main, self.delayKey, self.delayMouse, self.delayThread, self.app) cheese.test_spam_method()
Análisis estático del código fuente en Python Proceso de corrección Primer avance
Resultado
Ejemplo Global evaluation ----------Your code has been rated at -33.18/10 You have to do something quick !
Análisis estático del código fuente en Python Proceso de corrección Segundo avance
Segundo avance
Ejemplo $ pylint -help-msg=W0614 :W0614: *Unused import %s from wildcard import* Used when an imported module or variable is not used from a ’from X import *’ style import. This message belongs to the variables checker.
Análisis estático del código fuente en Python Proceso de corrección Segundo avance
Ejemplo # Incorrecto from PyQt4.QtCore import * # Correcto from PyQt4.QtCore import QTimer, QPoint, SIGNAL
Análisis estático del código fuente en Python Proceso de corrección Segundo avance
Enlaces de interés
Pylint: Análisis estático del código en Python Mensajes en Pylint Características de Pylint Tutorial de Pylint
Análisis estático del código fuente en Python Proceso de corrección Segundo avance
Enlaces de interés
Pylint: Análisis estático del código en Python Mensajes en Pylint Características de Pylint Tutorial de Pylint
Análisis estático del código fuente en Python Proceso de corrección Segundo avance
Enlaces de interés
Pylint: Análisis estático del código en Python Mensajes en Pylint Características de Pylint Tutorial de Pylint
Análisis estático del código fuente en Python Proceso de corrección Segundo avance
Enlaces de interés
Pylint: Análisis estático del código en Python Mensajes en Pylint Características de Pylint Tutorial de Pylint