python python-3.x type-hinting python-3.6 mypy

¿Cómo usar sugerencias de tipo en Python 3.6?



python-3.x type-hinting (3)

Noté que Python 3.5 y Python 3.6 agregaron muchas características sobre la verificación de tipos estáticos, así que probé con el siguiente código (en Python 3.6, versión estable).

from typing import List a: List[str] = [] a.append(''a'') a.append(1) print(a)

Lo que me sorprendió fue que Python no me dio un error o advertencia, aunque 1 se agregó a una list que solo debe contener cadenas. Pycharm detectó el error de tipo y me dio una advertencia al respecto, pero no era obvio y no se mostraba en la consola de salida, temía que a veces pudiera pasarlo por alto. Me gustaría los siguientes efectos:

  1. Si es obvio que usé el tipo incorrecto tal como se muestra arriba, arroje una advertencia o error.
  2. Si el compilador no pudo verificar confiablemente si el tipo que utilicé era correcto o incorrecto, ignórelo.

¿Es eso posible? Tal vez mypy podría hacerlo, pero preferiría usar la comprobación de tipo de estilo python-3.6 (como a: List[str] ) en lugar del estilo de comentario (como # type List[str] ) utilizado en mypy . Y tengo curiosidad por saber si hay un cambio en Python 3.6 nativo para lograr los dos puntos que dije anteriormente.


¿Es eso posible? Tal vez mypy podría hacerlo, pero preferiría usar la comprobación de tipo de estilo Python-3.6 (como a: List[str] ) en lugar del estilo de comentario (como # type List[str] ) utilizado en mypy. Y tengo curiosidad por saber si hay un cambio en Python 3.6 nativo para lograr los dos puntos que dije anteriormente.

No hay forma de que Python haga esto por usted; puede usar mypy para obtener la verificación de tipo (y el verificador incorporado de PyCharms también debería hacerlo). Además de eso, mypy tampoco te limita a escribir comentarios # type List[str] , puedes usar anotaciones variables como lo haces en Python 3.6 para que a: List[str] funcione igual de bien.

Con mypy como está, debido a que la versión es nueva, deberá instalar typed_ast y ejecutar mypy con --fast-parser y --python-version 3.6 como se documenta en los documentos de mypy . Esto probablemente cambiará pronto, pero por ahora los necesitará para que funcione sin problemas

Actualización: --fast-parser y --python-version 3.6 ya no son necesarios.

Después de hacer eso, mypy detecta la incompatibilidad de la segunda operación en su a: List[str] muy bien. Digamos que su archivo se llama tp_check.py con declaraciones:

from typing import List a: List[str] = [] a.append(''a'') a.append(1) print(a)

Ejecutando mypy con los argumentos antes mencionados (primero debe hacer pip install -U typed_ast ):

python -m mypy --fast-parser --python-version 3.6 tp_check.py

atrapa el error:

tp_check.py:5: error: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"

Como se señaló en muchas otras respuestas sobre sugerencias de tipo con Python , mypy y los verificadores de tipo de PyCharm son los que realizan la validación, no Python en sí . Python no usa esta información actualmente, solo la almacena como metadatos y la ignora durante la ejecución.


Las anotaciones de tipo en Python no están destinadas a aplicar el tipo. Cualquier cosa que implique dependencia de tipo estático en tiempo de ejecución significaría cambios tan fundamentales que ni siquiera tendría sentido continuar llamando al lenguaje resultante "Python".

Tenga en cuenta que la naturaleza dinámica de Python PERMITE que uno construya una herramienta externa, utilizando código de Python puro, para realizar la verificación del tipo de tiempo de ejecución. Haría que el programa se ejecute (muy) lentamente, pero tal vez sea adecuado para ciertas categorías de prueba.

Sin duda, uno de los fundamentos del lenguaje Python es que todo es un objeto y que puede intentar realizar cualquier acción en un objeto en tiempo de ejecución. Si el objeto no tiene una interfaz que se ajuste al intento de operación, fallará en tiempo de ejecución.

Los lenguajes que están tipados estáticamente por naturaleza funcionan de manera diferente: las operaciones simplemente deben estar disponibles en los objetos cuando se prueban en tiempo de ejecución. En el paso de compilación, el compilador crea los espacios y ranuras para los objetos apropiados en todo el lugar y, al escribir de manera no conforme, interrumpe la compilación.

La comprobación de tipos de Python permite que cualquier cantidad de herramientas haga exactamente eso: romper y advertir en un paso antes de ejecutar realmente la aplicación (pero independiente de la compilación misma). Pero la naturaleza del lenguaje no se puede cambiar para que realmente requiera que los objetos cumplan en tiempo de ejecución, y muy difícil de escribir y romper en el paso de compilación sería artificial.

Sin embargo, uno puede esperar que las futuras versiones de Python incorporen la verificación de tipos en tiempo de compilación en el tiempo de ejecución de Python, probablemente a través de un interruptor de línea de comando opcional. (No creo que alguna vez sea predeterminado, al menos para no romper la compilación, tal vez pueda ser predeterminado para emitir advertencias)

Por lo tanto, Python no requiere verificación de tipos estática en tiempo de ejecución porque dejaría de ser Python. Pero existe al menos un lenguaje que hace uso tanto de objetos dinámicos como de escritura estática: el lenguaje Cython, que en la práctica funciona como un superconjunto de Python. Uno debería esperar que Cython incorpore la nueva sintaxis de sugerencia de tipo para ser una declaración de tipo real muy pronto. (Actualmente utiliza una sintaxis diferente para las variables opcionales escritas estáticamente)


Las sugerencias de tipo deben ser ignoradas por el tiempo de ejecución de Python, y solo son verificadas por herramientas de terceros como mypy y el verificador integrado de Pycharm. También hay una variedad de herramientas de terceros menos conocidas que realizan la verificación de tipo en tiempo de compilación o tiempo de ejecución utilizando anotaciones de tipo, pero la mayoría de las personas usan el comprobador integrado AFYIK de mypy o Pycharm.

De hecho, dudo que la verificación de tipos alguna vez se integre en Python propiamente dicha en el futuro previsible; vea también la sección ''no objetivos'' de PEP 484 (que introdujo anotaciones de tipo) y PEP 526 (que introdujo anotaciones variables) como los comentarios de Guido here .

Personalmente, me alegraría que la verificación de tipos se integrara más fuertemente con Python, pero no parece que la comunidad de Python en general esté lista o dispuesta a tal cambio.

La última versión de mypy debe comprender tanto la sintaxis de anotación variable de Python 3.6 como la sintaxis de estilo de comentario. De hecho, las anotaciones variables fueron básicamente la idea de Guido en primer lugar (Guido es actualmente una parte del equipo mypy), básicamente, el soporte para anotaciones de tipo en mypy y en Python se desarrolló de manera bastante simultánea.