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

typinglas 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 introdujoTypedDicty describe la totalidad como tal. Usó untotalargumento, que tendría sentido cambiar el nombre de dunder-style por laclasssintaxis. 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
TypedDicty totalidad , pero nuevamente no hay referencia a la sintaxis de dunder. Profundizar en su implementación condujo a una mayor confusión, comoTypedDictTypeen types.py no tiene un campo total, sino separadoitemsyrequired_keys. La totalidad implicaría eso,items.keys()==required_keyspero la implementación hace suposiciones diferentes, comocan_be_falseconfiaritemssolo.total=Falseen principio debería significar querequired_keysestá vacío.La fuente CPython para _TypedDictMeta al menos revela que el
totalargumento y el__total__dunder son uno y el mismo, aunque la fuente se describe aTypedDictsí misma como "puede agregarse pronto".fuente
can_be_falseque se trata de un error de MyPy, posiblemente relacionado con no haber planeado tener campos opcionales desde el principio.TypedDictfue aceptado en Python 3.8 a través de PEP 589 . Desde Python, parece que__total__es una bandera booleana configuradaTruepor 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 nuevatotalpalabra 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=Falseanula 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=Falsepermite teclas opcionales:Ver también
TypedDicten Python 3.8 por Real Pythontyping-extensionspaquete para usarTypedDicten Python 3.5, 3.6fuente