Está en la página 1de 76

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

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


Pylint

Milton Mazzarri
<milmazz@gmail.com>

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

now previous difference


nb duplicated lines 274 NC NC
percent duplicated lines 5.591 NC NC
Análisis estático del código fuente en Python
Reportes

Estadísticas por tipo

type number %documented %badname


module 14 85.71 57.14
class 12 100.00 66.67
method 145 85.52 83.45
function 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 convention


tests.test_cheese 75.00 1.93 9.09 20.48
tests.test_spam 25.00 1.86 4.55 27.01
tests.test_main 0.00 78.97 33.33 4.17
tests.test_eggs 0.00 2.35 4.55 28.94
tests.test_ham 0.00 1.89 4.55 4.11
tests.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 difference


convention 1655 NC NC
refactor 66 NC NC
warning 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:
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

También podría gustarte