Pylint: Análisis estático del código fuente en Python

76
Análisis estático del código fuente en Python Análisis estático del código fuente en Python Pylint Milton Mazzarri <[email protected]> Marzo, 2010

Transcript of Pylint: Análisis estático del código fuente en Python

Análisis estático del código fuente en Python

Análisis estático del código fuente en PythonPylint

Milton Mazzarri<[email protected]>

Marzo, 2010

Análisis estático del código fuente en Python

Contenido I

1 ConceptosAnálisis estático de códigoPylint

2 ConsideracionesLabores de revisión manualFalsos positivos

3 RevisionesBásicasVariablesClasesDiseñoImportacionesConflictos de estilosFormato

Análisis estático del código fuente en Python

Contenido IIOtras revisiones

4 Reportes

5 Puntuación

6 Proceso de correcciónInstalaciónEjecuciónConociendo el detalle del errorPrimer avanceSegundo 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ónEl análisis estático del código se refiere al proceso deevaluación del código fuente sin ejecutarlo, en base a esteanálisis se obtendrá información que nos permita mejorar lalínea base de nuestro proyecto, sin alterar la semántica originalde la aplicación.

Análisis estático del código fuente en Python

Conceptos

Pylint

¿Qué es Pylint?

DefiniciónSu misión es analizar código en Python en busca de errores osíntomas de mala calidad en el código fuente. Cabe destacarque por omisión, la guía de estilo a la que se trata de apegarPylint 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 altonivel:

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 altonivel:

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 altonivel:

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 altonivel:

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 altonivel:

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 positivosPuede entenderse al recibir una alerta de algún cambioque usted realizó conscientemente.Algunas de las advertencias encontradas pueden serpeligrosas en algunos contextos, pero en otros puede noaplicar.Se hacen revisiones de declaraciones que a ustedrealmente no le importan.

Informe al revisor para ajustar la configuración de Pylintpara no ser informado acerca de ciertos tipos deadvertencias o errores.

Análisis estático del código fuente en Python

Consideraciones

Falsos positivos

Falsos positivos

Pylint puede arrojar falsos positivosPuede entenderse al recibir una alerta de algún cambioque usted realizó conscientemente.Algunas de las advertencias encontradas pueden serpeligrosas en algunos contextos, pero en otros puede noaplicar.Se hacen revisiones de declaraciones que a ustedrealmente no le importan.

Informe al revisor para ajustar la configuración de Pylintpara no ser informado acerca de ciertos tipos deadvertencias o errores.

Análisis estático del código fuente en Python

Consideraciones

Falsos positivos

Falsos positivos

Pylint puede arrojar falsos positivosPuede entenderse al recibir una alerta de algún cambioque usted realizó conscientemente.Algunas de las advertencias encontradas pueden serpeligrosas en algunos contextos, pero en otros puede noaplicar.Se hacen revisiones de declaraciones que a ustedrealmente no le importan.

Informe al revisor para ajustar la configuración de Pylintpara no ser informado acerca de ciertos tipos deadvertencias o errores.

Análisis estático del código fuente en Python

Consideraciones

Falsos positivos

Falsos positivos

Pylint puede arrojar falsos positivosPuede entenderse al recibir una alerta de algún cambioque usted realizó conscientemente.Algunas de las advertencias encontradas pueden serpeligrosas en algunos contextos, pero en otros puede noaplicar.Se hacen revisiones de declaraciones que a ustedrealmente no le importan.

Informe al revisor para ajustar la configuración de Pylintpara no ser informado acerca de ciertos tipos deadvertencias o errores.

Análisis estático del código fuente en Python

Consideraciones

Falsos positivos

Falsos positivos

Pylint puede arrojar falsos positivosPuede entenderse al recibir una alerta de algún cambioque usted realizó conscientemente.Algunas de las advertencias encontradas pueden serpeligrosas en algunos contextos, pero en otros puede noaplicar.Se hacen revisiones de declaraciones que a ustedrealmente no le importan.

Informe al revisor para ajustar la configuración de Pylintpara no ser informado acerca de ciertos tipos deadvertencias 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 ysentencias 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 ysentencias 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 ysentencias 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 ysentencias 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 ysentencias 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 ysentencias 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 ysentencias 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 builtinso 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 builtinso 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 builtinso 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 builtinso 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, variablesví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, variablesví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, variablesví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, variablesví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 autorizadasSangrado estricto del códigoLongitud de la líneaUso de <> en vez de !=

Análisis estático del código fuente en Python

Revisiones

Formato

Revisiones de formato

Construcciones no autorizadasSangrado estricto del códigoLongitud de la líneaUso de <> en vez de !=

Análisis estático del código fuente en Python

Revisiones

Formato

Revisiones de formato

Construcciones no autorizadasSangrado estricto del códigoLongitud de la líneaUso de <> en vez de !=

Análisis estático del código fuente en Python

Revisiones

Formato

Revisiones de formato

Construcciones no autorizadasSangrado estricto del códigoLongitud de la líneaUso 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 unadeclaración de encoding. PEP-263Búsqueda por similitudes o duplicación en el códigofuente.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 unadeclaración de encoding. PEP-263Búsqueda por similitudes o duplicación en el códigofuente.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 unadeclaración de encoding. PEP-263Búsqueda por similitudes o duplicación en el códigofuente.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 unadeclaración de encoding. PEP-263Búsqueda por similitudes o duplicación en el códigofuente.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 unadeclaración de encoding. PEP-263Búsqueda por similitudes o duplicación en el códigofuente.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, Pylintdespliega una serie de reportes, cada uno de ellosenfocándose en un aspecto particular del proyecto, como elnúmero de mensajes por categorias, dependencias demódulos, . . .

Análisis estático del código fuente en Python

Reportes

Número de módulos procesados

EjemploReport======1895 statements analysed.

Análisis estático del código fuente en Python

Reportes

Duplicación de código fuente

now previous differencenb duplicated lines 274 NC NCpercent duplicated lines 5.591 NC NC

Análisis estático del código fuente en Python

Reportes

Estadísticas por tipo

type number %documented %badnamemodule 14 85.71 57.14class 12 100.00 66.67method 145 85.52 83.45function 1 100.00 0.00

Análisis estático del código fuente en Python

Reportes

Errores y advertencias por módulo

module error warning refactor conventiontests.test_cheese 75.00 1.93 9.09 20.48tests.test_spam 25.00 1.86 4.55 27.01tests.test_main 0.00 78.97 33.33 4.17tests.test_eggs 0.00 2.35 4.55 28.94tests.test_ham 0.00 1.89 4.55 4.11tests.common 0.00 1.86 9.09 3.56

Análisis estático del código fuente en Python

Reportes

Número de mensajes por categorías

type number previous differenceconvention 1655 NC NC

refactor 66 NC NCwarning 28339 NC NC

error 4 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:

ColoreadoTextoMSVS (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:

ColoreadoTextoMSVS (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:

ColoreadoTextoMSVS (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:

ColoreadoTextoMSVS (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 11010W0621 10837W0614 6169C0301 1133C0103 346W0105 103C0324 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 lacorrida actual, de esta manera puede saber si ha mejorado lacalidad de su código o no.

EjemploGlobal evaluation-----------Your code has been rated at -148.73/10You 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 -versionpylint 0.19.0,astng 0.19.3, common 0.48.1Python 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 enpylint_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 definedbut not used.This message belongs to thevariables 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.pydef 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.pydef test_ham(self):

from scia.tests.common import TestSpamcheese = 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/10You 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 moduleor variable is not usedfrom a ’from X import *’style import.This message belongs to thevariables checker.

Análisis estático del código fuente en Python

Proceso de corrección

Segundo avance

Ejemplo# Incorrectofrom PyQt4.QtCore import *# Correctofrom 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 PythonMensajes en PylintCaracterísticas de PylintTutorial 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 PythonMensajes en PylintCaracterísticas de PylintTutorial 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 PythonMensajes en PylintCaracterísticas de PylintTutorial 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 PythonMensajes en PylintCaracterísticas de PylintTutorial de Pylint