4 comprobadores de tipo Python para mantener limpio su código

Al principio, Python no tenía decoraciones tipográficas. Eso encaja con el objetivo general de hacer que el lenguaje sea rápido y fácil de trabajar, con tipos de objetos flexibles que se adaptan a los giros y vueltas de la escritura de código y ayudan a los desarrolladores a mantener su código conciso.

Sin embargo, en los últimos años, Python ha agregado soporte para anotaciones de tipos, inspirando toda una cultura de software dedicada a la verificación de tipos de Python durante el desarrollo. Python no comprueba los tipos en tiempo de ejecución, al menos todavía no. Pero al aprovechar un buen verificador de tipos, montando la escopeta con usted en su IDE de elección, puede usar las anotaciones de tipo de Python para descartar muchos errores comunes antes de que lleguen a producción.

En este artículo, profundizaremos en cuatro de los principales complementos de verificación de tipos para Python. Todos siguen aproximadamente el mismo patrón, escaneando el código Python con anotaciones de tipo y proporcionando comentarios. Pero cada uno ofrece sus propias adiciones útiles al concepto básico.

Mypy

Podría decirse que Mypy fue el primer sistema de verificación de tipos estáticos para Python, ya que el trabajo en él comenzó en 2012 y todavía está en desarrollo activo. Es esencialmente el prototipo de cómo funcionan las bibliotecas de verificación de tipos de terceros en Python, incluso si muchas otras han aparecido desde entonces y han ampliado sus características.

Mypy puede ejecutarse de forma independiente, o desde la línea de comandos, o puede funcionar como parte de un editor o la integración de linter del IDE. Muchos editores e IDE integran Mypy; La extensión Python de Visual Studio Code puede trabajar con ella directamente. Cuando se ejecuta, Mypy genera informes sobre la coherencia de su código en función del tipo de información que proporciona.

Si su código no incluye anotaciones de tipo, Mypy no realizará la gran mayoría de sus verificaciones de código. Sin embargo, puede utilizar Mypy para marcar el código no anotado. Esto se puede hacer con diversos grados de rigor según las necesidades de cada uno.

Si está comenzando desde cero con una base de código y desea una estrategia de linting preventivamente agresiva, puede usar la --strictopción para evitar cualquier código sin escribir. Por otro lado, si está trabajando con una base de código heredada que no tiene muchas definiciones de tipo, puede usar opciones más relajadas, como evitar solo definiciones de funciones sin tipo  --disallow-untyped-defs y permitir otro código sin tipo. Y siempre puede usar comentarios en línea # type: ignorepara evitar que se marquen líneas individuales.

Mypy puede utilizar archivos de código auxiliar PEP 484 cuando desee utilizar sugerencias de tipo para las interfaces públicas de un módulo. Además de esto, Mypy ofrece stubgenuna herramienta que genera automáticamente archivos stub a partir del código existente. Para el código sin tipo, los archivos stub usan tipos genéricos, que luego puede marcar según sea necesario.

Pytype

Pytype, creado por Google, se diferencia de Mypy en el uso de inferencias en lugar de solo descriptores de tipo. En otras palabras, Pytype intenta determinar los tipos analizando el flujo de código, en lugar de depender estrictamente de las anotaciones de tipos.

Pytype yerra por el lado de la indulgencia cuando tiene sentido hacerlo. Si tiene una operación que funciona en tiempo de ejecución y no contradice ninguna anotación, Pytype no se quejará al respecto. Sin embargo, esto significa que algunos problemas que deberían ser marcados (por ejemplo, declarar una variable con un tipo en un punto y luego redefinirla en el mismo contexto) pasan sin previo aviso. La documentación indica que tales cosas no se permitirán en algún momento en el futuro.

Si elige agregar anotaciones de tipo a su código, entonces la reveal_typefunción de Pytype es  especialmente útil. Si inserta una declaración en su código que lee reveal_type(expr), Pytype evalúa expry emite una alerta que describe su tipo. 

Tenga en cuenta que ciertos comportamientos de Pytype se controlan agregando atributos al código en sí. Por ejemplo, si desea evitar que Pytype se queje de atributos faltantes o miembros del módulo que se establecen dinámicamente, debe agregar el atributo _HAS_DYNAMIC_ATTRIBUTES = Truea la clase o módulo en cuestión, en lugar de establecer algún tipo de metadatos de configuración de Pytype.

Pyright / Pylance

Pyright es el verificador de tipos de Python de Microsoft, incluido como parte de la extensión Pylance para Visual Studio Code. Si ya es un usuario de VS Code, la extensión Pylance es la forma más conveniente de trabajar con Pyright; solo instálalo y listo. Pyright proporciona una buena experiencia de verificación de tipos y codificación todo en uno, con muchas de las mismas comodidades y avances que las herramientas de análisis Python anteriores.

Al igual que Pytype, Pyright puede trabajar con bases de código que no tienen ningún tipo de información. En esos casos, Pyright hará todo lo posible para inferir qué tipos están en juego. Por lo tanto, aún puede obtener buenos resultados con Pytype en bases de código más antiguas sin declaraciones de tipo. Pero obtendrá mejores resultados con el tiempo a medida que agregue progresivamente anotaciones de tipo a su código.

Pyright es muy flexible en formas que complementan los diseños de proyectos Python del mundo real. Al igual que con otros verificadores de tipo, Pyright se puede configurar por proyecto con un archivo de configuración con formato JSON en el directorio del proyecto. Las rutas individuales se pueden excluir (nunca comprobar) o ignorar (se eliminan los errores y advertencias) en el archivo de configuración, y las opciones son muy granulares.

En VS Code, los espacios de trabajo con múltiples raíces pueden tener cada uno su propia configuración de Pyright, en caso de que diferentes partes del proyecto necesiten diferentes configuraciones de linting. En la misma línea, puede definir múltiples "entornos de ejecución" dentro de un proyecto, cada uno con su propio venv o rutas de importación.

Pira 

Creado por desarrolladores de Facebook e Instagram, Pyre es en realidad dos herramientas en una: un verificador de tipos (Pyre) y una herramienta de análisis de código estático (Pysa). Los dos están diseñados para trabajar de la mano para proporcionar un mayor nivel de verificación y análisis que otras herramientas, aunque el usuario debe hacer un poco de trabajo pesado para aprovecharlas al máximo.

Pyre adopta un enfoque similar al de Pytype y Mypy. El código sin tipo se maneja de manera más indulgente que el código escrito, por lo que puede comenzar con una base de código de Python sin tipo y agregar anotaciones función por función y módulo por módulo. Active el "modo estricto" en un módulo y Pyre marcará las anotaciones que falten. O puede hacer que el modo estricto sea el predeterminado y optar por no participar en el nivel del módulo. Pyre también funcionará con archivos de código auxiliar en formato .pyi.

Pyre tiene una característica poderosa para migrar bases de código a un formato escrito. La inferopción de línea de comandos ingiere un archivo o directorio, hace conjeturas fundamentadas sobre los tipos utilizados y aplica las anotaciones a los archivos. Sin embargo, primero querrá hacer copias de seguridad de su código. (Si desea obtener información de tipo de un programa Python en ejecución , puede hacerlo con otro proyecto de Facebook / Instagram, MonkeyType).

Si bien las características de Pyre se hacen eco de las de los otros paquetes que se detallan aquí, Pysa es único. Pysa realiza un "análisis de contaminación" en el código para identificar posibles problemas de seguridad, basándose en una biblioteca de análisis de flujo para ciertos componentes de software y marcando el código que parece ser vulnerable. Cualquier cosa tocada por ese código también se marcará como contaminada, aunque puede especificar componentes que desinfectan los datos y eliminan esos datos del gráfico de contaminación.

Un inconveniente es que la biblioteca de Pysa de análisis de contaminación de componentes de terceros es todavía pequeña, por lo que es posible que deba diseñar su propio modelo. Pero muchos de los análisis de contaminación son para software que se usa ampliamente, como el marco web Django, SQL Alchemy ORM y la biblioteca de ciencia de datos de Pandas, sin mencionar los análisis para problemas comunes del sistema de archivos.

Cómo hacer más con Python

  • Cómo trabajar con el tipo de datos de lista de Python
  • Cómo empaquetar aplicaciones Python con BeeWare Briefcase
  • Cómo ejecutar Anaconda al lado de otras Pythons
  • Cómo usar las clases de datos de Python
  • Comience con async en Python
  • Cómo usar asyncio en Python
  • 3 pasos para una revisión de Python async
  • Cómo usar PyInstaller para crear ejecutables de Python
  • Tutorial de Cython: Cómo acelerar Python
  • Cómo instalar Python de forma inteligente
  • Cómo administrar proyectos de Python con Poetry
  • Cómo administrar proyectos de Python con Pipenv
  • Virtualenv y venv: explicación de los entornos virtuales de Python
  • Python virtualenv y venv qué hacer y qué no hacer
  • Explicación de subprocesos y subprocesos de Python
  • Cómo usar el depurador de Python
  • Cómo usar timeit para perfilar el código Python
  • Cómo usar cProfile para perfilar el código Python
  • Cómo convertir Python a JavaScript (y viceversa)