TypedDict
fue aceptado en Python 3.8 a través de PEP 589 . Desde Python, parece que __total__
es una bandera booleana configurada True
por defecto:
tot = TypedDict.__total__
print(type(tot))
print(tot)
# <class 'bool'>
# True
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 nueva total
palabra clave introducida en Python 3.8 :
# cypthon/typing.py
class _TypedDictMeta(type):
def __new__(cls, name, bases, ns, total=True):
"""Create new typed dict class object.
...
"""
...
if not hasattr(tp_dict, '__total__'):
tp_dict.__total__ = total
...
¿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:
# rgb_bad.py
from typing import TypedDict
class Color(TypedDict):
r: int
g: int
b: int
a: float
blue = Color(r=0, g=0, b=255) # missing "a"
# rgb_good.py
from typing import TypedDict
class Color(TypedDict, total=False):
r: int
g: int
b: int
a: float
blue = Color(r=0, g=0, b=255) # missing "a"
Manifestación
Si falta una clave, mypy se quejará en la línea de comando:
> mypy code/rgb_bad.py
code\rgb_bad.py:11: error: Key 'a' missing for TypedDict "Color"
...
La configuración total=False
permite teclas opcionales:
> mypy code/rgb_good.py
Success: no issues found in 1 source file
Ver también
- Tweet por R. Hettinger demostrando la totalidad
- Sección PEP sobre totalidad en PEP 589
- Artículo Sección sobre tipos y
TypedDict
en Python 3.8 por Real Python
typing-extensions
paquete para usar TypedDict
en Python 3.5, 3.6
typing
las partes internas no está documentado, y la parte que sí está documentada de manera deficiente.