En python doc sobre __future__ hay una tabla a continuación donde se muestra que las anotaciones son "opcionales en" 3.7.0b1 y "obligatorias en" 4.0 pero todavía puedo usar anotaciones en 3.8.2 sin importar anotaciones, entonces ¿de qué sirve? .
>>> def add_int(a:int, b:int) -> int: ... return a + b >>> add_int.__annotations__ {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}Dudo que no entienda claramente el significado de "opcional en" y "obligatorio en" aquí
Obligatorio es una interesante elección de palabras. Supongo que significa que está por defecto en el idioma. No tiene que habilitarlo con from __future__ import annotations
La función de annotations hace referencia al PEP 563: Evaluación pospuesta de anotaciones. Es una mejora de la función de anotaciones existente que se introdujo inicialmente en python 3.0 y se redefinió como sugerencias de tipo en python 3.5, por eso su código funciona en python 3.8.
Esto es lo que opcional from __future__ import annotations en python 3.7+:
class A: def f(self) -> A: # NameError: name 'A' is not defined passpero esto funciona
from __future__ import annotations class A: def f(self) -> A: passVea este capítulo en python 3.7 qué hay de nuevo sobre las anotaciones pospuestas:
Dado que este cambio rompe la compatibilidad, el nuevo comportamiento debe habilitarse por módulo en Python 3.7 usando una importación
__future__:
from __future__ import annotationsSe convertirá en el predeterminado en Python 3.10*.
* se anunció que sería predeterminado en 3.10 (cuando se lanzó python3.7), pero ahora se movió a una versión posterior
Obligatorio como viene por defecto. Opcional, ya que es necesario que se "active" desde una declaración from __future__ import annotations