TypedDict & NamedTuple
TypedDict añade forma estática a los dicts, perfecto para blobs JSON. NamedTuple proporciona registros inmutables más ligeros que dataclasses para filas de solo lectura.
Busca en todas las páginas de la documentación
TypedDict añade forma estática a los dicts, perfecto para blobs JSON. NamedTuple proporciona registros inmutables más ligeros que dataclasses para filas de solo lectura.
from typing import TypedDict
class UserRow(TypedDict):
id: int
email: str
def load(row: UserRow) -> str:
return row["email"]Cuándo usar esto:
response.json()from typing import NamedTuple, NotRequired, TypedDict
class Address(TypedDict, total=False):
street: str
city: str
zip: NotRequired[str]
class User(TypedDict):
id: int
name: str
address: Address
class Point(NamedTuple):
x: int
y: int
def format_user(user: User) -> str:
city = user.get("address", {}).get("city", "unknown")
return f"{user['name']} ({city})"
def distance(a: Point, b: Point) -> float:
return ((a.x - b.x) ** 2 + (a.y - b.y) ** 2) ** 0.5
if __name__ == "__main__":
row: User = {"id": 1, "name": "Ada", "address": {"city": "London"}}
print(format_user(row))
print(distance(Point(0, 0), Point(3, 4)))Lo que esto demuestra:
total=False hace que las claves de Address sean opcionales estáticamenteNotRequired marca claves opcionales en un TypedDict que de otro modo sería total (3.11+)user["name"]total - Todas las claves son requeridas cuando total=True (por defecto).| Tipo | Tiempo de Ejecución | Mutable |
|---|---|---|
| TypedDict | dict | Sí |
| NamedTuple | tuple | No |
| dataclass | object | Configurable |
| Pydantic | BaseModel | Sí |
# Clave requerida en TypedDict parcial (3.11+)
class Config(TypedDict, total=False):
debug: NotRequired[bool]
host: str # requerido si se usa Required[] en patrones parcialesuser["emial"]; el tiempo de ejecución todavía produce KeyError. Solución: Verificación estática + pruebas.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Pydantic BaseModel | Validación HTTP | Acceso a dict en bucle caliente |
| dataclass | Métodos + valores por defecto | Debe permanecer como dict |
| attrs | Ecosistema attrs | Mínimo de la librería estándar |
| dict[str, Any] simple | Solo prototipo | API de producción |
TypedDict cuando el valor debe permanecer como dict (APIs JSON). dataclass para objetos de dominio con comportamiento.
NamedTuple para semántica de tupla más ligera; dataclass frozen cuando se necesitan valores por defecto y métodos.
total=False en todo el dict o NotRequired por clave en 3.11+.
Componer TypedDicts más pequeños como tipos de campo - refleja el anidamiento JSON.
Mapeo manual o Pydantic model_validate en capas de conexión.
Anotar en el cuerpo de la clase - NamedTuple soporta anotaciones PEP 526.
No es un tipo en tiempo de ejecución - isinstance solo comprueba dict. Usa una librería de validación.
Convertir filas a TypedDict después de validar que las claves requeridas están presentes.
El hijo puede añadir claves opcionales; entender las reglas de claves requeridas a través de la herencia.
Pydantic preferido para OpenAPI; TypedDict para contratos de dict de servicios internos.
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026