TypedDict se presentó en PEP-589 y se incorporó en Python 3.8. Se usa principalmente para crear anotaciones de tipo para diccionarios.
- En lugar de usar
dataclass o pydantic para representar datos de tipo “registro”, TypedDict aprovecha la flexibilidad de los diccionarios y resulta ventajoso cuando puede haber campos faltantes.
- Por ejemplo, se define la clase
Movie y se asigna al variable movie un diccionario de tipo Movie
class Movie(TypedDict):
title: str
movie: Movie = {"title": "Avatar"}
No totalidad
TypedDict admite el concepto de no totalidad, que indica que puede haber campos faltantes. Esto es útil al implementar endpoints HTTP PATCH
dataclass no tiene el concepto de campos faltantes, así que puede resultar incómodo
- En
TypedDict, se puede manejar de forma flexible la ausencia de campos configurando total=False
- En PEP-655, se pueden marcar campos individuales con
Required y NotRequired
Uso de TypedDict como **kwargs
- PEP-692 permite tipar argumentos variables por palabra clave usando
TypedDict
- Usar
TypedDict puede hacer que el código se vea verboso, pero es útil cuando se reutiliza en varias definiciones de funciones
- Su fortaleza se nota aún más al usarlo junto con la no totalidad
- Por ejemplo, al personalizar
pytest.fixture y reenviar algunos argumentos tal cual
- Se puede lograr un comportamiento similar con valores centinela, pero las anotaciones de tipo pueden volverse incómodas
Uso de TypedDict para inyección de dependencias
- PEP-692 permite hacer comprobación de tipos en llamadas a funciones que usan
TypedDict
- Es útil cuando muchos recursos comparten algunas dependencias
- Se define un
TypedDict similar a la suma de los kwargs de todos los recursos
- Luego se reescriben los recursos para que acepten argumentos arbitrarios y se usa
TypedDict para la inyección de dependencias
- A través del sistema de tipos, es posible detectar errores o faltantes de argumentos en la inyección de dependencias
- Cambiar la firma de los recursos no es ideal, pero sigue siendo un cambio menor que usar un framework de inyección de dependencias
- Muchos frameworks no admiten comprobación estática de tipos
Funciones futuras
- PEP-728 permitirá definir el tipo de elementos adicionales y crear diccionarios cerrados que no acepten elementos extra
- Esto ayuda a definir con mayor precisión los tipos de registro
- PEP-705 permitirá marcar elementos como de solo lectura (según el momento de la publicación, puede que ya se haya lanzado)
- Esto aborda situaciones en las que puede haber problemas por mutación potencial (eliminación) entre distintos
TypedDict que intuitivamente deberían ser compatibles
Resumen de GN⁺
TypedDict aprovecha la flexibilidad de los diccionarios y resulta ventajoso cuando puede haber campos faltantes.
TypedDict ofrece una opción más flexible que otras estructuras de datos como dataclass o pydantic.
- Según el dominio, conviene elegir la herramienta adecuada, pero vale la pena tener presentes las ventajas de
TypedDict
2 comentarios
Si los datos suelen llegar desde fuera en formato JSON o se exportan con frecuencia fuera de Python, conviene usar
TypedDict; si no, recomiendo usardataclassoNamedTupleestructurados.Opiniones de Hacker News
Las personas que prefieren el tipado dinámico están reconociendo cada vez más la importancia de los sistemas de tipos
Razones para usar
dataclass(slots=True)en lugar deTypedDict.foobaren vez de["foobar"]cansa menos la muñecaSin un sistema que haga cumplir los tipos,
TypedDictno cumple ninguna funciónfloat, Python base no lo impide ni lo adviertePydanticEl título "thank you think" suena excesivamente grosero
En la frase sobre la suscripción, el significado de "None" no queda claro
Experiencia personal con
TypedDictTypedDictpara anotardictsy mejorar la legibilidad del códigodict, es una buena soluciónLa funcionalidad de
TypedDictes buena, pero la sintaxis de declaración es complicada