5 puntos por GN⁺ 2024-10-14 | 2 comentarios | Compartir por WhatsApp
  • 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

 
ilotoki0804 2024-10-15

Si los datos suelen llegar desde fuera en formato JSON o se exportan con frecuencia fuera de Python, conviene usar TypedDict; si no, recomiendo usar dataclass o NamedTuple estructurados.

 
GN⁺ 2024-10-14
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

    • Un mejor sistema de tipos es superior a uno peor
  • Razones para usar dataclass(slots=True) en lugar de TypedDict

    • El acceso a atributos es más rápido, así que el código corre más rápido
    • Las clases con slots usan menos RAM y generan menos presión sobre la caché L1, así que el código corre más rápido
    • Al acceder a atributos, usar .foobar en vez de ["foobar"] cansa menos la muñeca
    • Si escribes mal el nombre de un atributo, ocurre un error en tiempo de ejecución
  • Sin un sistema que haga cumplir los tipos, TypedDict no cumple ninguna función

    • Aunque guardes por error una cadena en una propiedad anotada como float, Python base no lo impide ni lo advierte
    • Si quieres hacer cumplir los tipos de verdad, tienes que usar herramientas como Pydantic
  • El título "thank you think" suena excesivamente grosero

    • "than i thought" se lee mejor
  • En la frase sobre la suscripción, el significado de "None" no queda claro

    • La gramática es compleja y difícil de entender
  • Experiencia personal con TypedDict

    • Uso TypedDict para anotar dicts y mejorar la legibilidad del código
    • Eso me permitió reducir el tiempo dedicado a rastrear rutas del código
    • Necesito mejorar mis habilidades de programación, pero en apps que usan muchos dict, es una buena solución
  • La funcionalidad de TypedDict es buena, pero la sintaxis de declaración es complicada