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

5,423 views

Published on

Se describe el concepto detrás del análisis estático del código, se indican los pasos a seguir para la detección de errores mediante la herramienta Pylint, se exponen sus funcionalidades, reportes y se muestran ejemplos para corregir los errores encontrados por la herramienta.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
5,423
On SlideShare
0
From Embeds
0
Number of Embeds
2,779
Actions
Shares
0
Downloads
32
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. 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
  2. 2. 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
  3. 3. 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
  4. 4. 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.
  5. 5. 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.
  6. 6. 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.
  7. 7. 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.
  8. 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.
  9. 9. 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.
  10. 10. 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.
  11. 11. 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.
  12. 12. 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.
  13. 13. 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.
  14. 14. 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.
  15. 15. 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.
  16. 16. 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.
  17. 17. 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.
  18. 18. 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.
  19. 19. 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.
  20. 20. 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.
  21. 21. 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.
  22. 22. 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.
  23. 23. 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.
  24. 24. 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.
  25. 25. 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.
  26. 26. 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.
  27. 27. 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.
  28. 28. 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.
  29. 29. 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.
  30. 30. 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.
  31. 31. 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, . . .
  32. 32. 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, . . .
  33. 33. 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.
  34. 34. 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.
  35. 35. 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.
  36. 36. 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.
  37. 37. 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.
  38. 38. 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.
  39. 39. 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 !=
  40. 40. 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 !=
  41. 41. 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 !=
  42. 42. 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 !=
  43. 43. 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.
  44. 44. 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.
  45. 45. 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.
  46. 46. 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.
  47. 47. 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.
  48. 48. 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, . . .
  49. 49. Análisis estático del código fuente en Python Reportes Número de módulos procesados Ejemplo Report ====== 1895 statements analysed.
  50. 50. 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
  51. 51. 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
  52. 52. 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
  53. 53. 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
  54. 54. 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.
  55. 55. 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.
  56. 56. 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.
  57. 57. 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.
  58. 58. 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.
  59. 59. 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.
  60. 60. 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.
  61. 61. 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.
  62. 62. 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.
  63. 63. 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
  64. 64. 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 !
  65. 65. 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]
  66. 66. 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.
  67. 67. 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.
  68. 68. 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()
  69. 69. 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()
  70. 70. 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 !
  71. 71. 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.
  72. 72. 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
  73. 73. 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
  74. 74. 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
  75. 75. 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
  76. 76. 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

×