En Python 3.8 recientemente lanzado hay una nueva anotación de tipo typing.TypedDict
. Su documentación menciona que
Se puede acceder a la información de tipo para introspección a través de
Point2D.__annotations__
yPoint2D.__total__
. [....]
Si __annotations__
bien es bien conocido, habiendo sido introducido en PEP 3107 , no puedo encontrar ninguna información sobre __total__
. ¿Alguien podría explicar su significado y, si es posible, vincularlo a fuentes autorizadas?
python
python-3.x
python-typing
Antti Haapala
fuente
fuente
typing
las partes internas no está documentado, y la parte que sí está documentada de manera deficiente.Respuestas:
Supongo que el
__total__
campo significa si las instancias deben estar completas (el valor predeterminado) o no (todos los campos son opcionales). Comencé mi búsqueda en PEP 589 , que introdujoTypedDict
y describe la totalidad como tal. Usó untotal
argumento, que tendría sentido cambiar el nombre de dunder-style por laclass
sintaxis. Sin embargo, no encontré cuándo tuvo lugar ese cambio de nombre.Mirando a MyPy, que es el verificador de tipo real que se preocupa por estas anotaciones, hay documentación similar
TypedDict
y totalidad , pero nuevamente no hay referencia a la sintaxis de dunder. Profundizar en su implementación condujo a una mayor confusión, comoTypedDictType
en types.py no tiene un campo total, sino separadoitems
yrequired_keys
. La totalidad implicaría eso,items.keys()==required_keys
pero la implementación hace suposiciones diferentes, comocan_be_false
confiaritems
solo.total=False
en principio debería significar querequired_keys
está vacío.La fuente CPython para _TypedDictMeta al menos revela que el
total
argumento y el__total__
dunder son uno y el mismo, aunque la fuente se describe aTypedDict
sí misma como "puede agregarse pronto".fuente
can_be_false
que se trata de un error de MyPy, posiblemente relacionado con no haber planeado tener campos opcionales desde el principio.TypedDict
fue aceptado en Python 3.8 a través de PEP 589 . Desde Python, parece que__total__
es una bandera booleana configuradaTrue
por defecto:Como se mencionó en otras publicaciones, los detalles sobre este método están limitados en los documentos , pero el enlace de @Yann Vernier al código fuente de CPython sugiere que
__total__
está relacionado con la nuevatotal
palabra clave introducida en Python 3.8 :¿Como funciona?
Sinopsis : de forma predeterminada, todas las claves son necesarias cuando se crea una instancia definida
TypedDict
.total=False
anula esta restricción y permite claves opcionales. Vea la siguiente demostración.Dado
Un árbol de directorios de prueba:
Código
Archivos en el directorio de prueba:
Manifestación
Si falta una clave, mypy se quejará en la línea de comando:
La configuración
total=False
permite teclas opcionales:Ver también
TypedDict
en Python 3.8 por Real Pythontyping-extensions
paquete para usarTypedDict
en Python 3.5, 3.6fuente