TypedDict & NamedTuple
TypedDict adiciona forma estática a dicionários (dict) - perfeito para blobs JSON. NamedTuple fornece registros imutáveis mais leves que dataclasses para linhas somente leitura.
Busque em todas as páginas da documentação
TypedDict adiciona forma estática a dicionários (dict) - perfeito para blobs JSON. NamedTuple fornece registros imutáveis mais leves que dataclasses para linhas somente leitura.
from typing import TypedDict
class UserRow(TypedDict):
id: int
email: str
def load(row: UserRow) -> str:
return row["email"]Quando usar isso:
response.json()dict)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)))O que isso demonstra:
total=False torna as chaves de Address opcionais estaticamenteNotRequired marca chaves opcionais em TypedDict que, de outra forma, seria total (3.11+)TypedDict ainda é um dict em tempo de execução - acesso via user["name"]NamedTuple acessados como atributos com desempacotamento de tuplatotal - Todas as chaves são obrigatórias quando total=True (padrão).TypedDict pode estender outros TypedDict para formas de API aninhadas.tuple; imutável; pode ter métodos com moderação.NotRequired em typing.| Tipo | Tempo de Execução | Mutável |
|---|---|---|
| TypedDict | dict | Sim |
| NamedTuple | tuple | Não |
| dataclass | object | Configurável |
| Pydantic | BaseModel | Sim |
# Chave obrigatória em TypedDict parcial (3.11+)
class Config(TypedDict, total=False):
debug: NotRequired[bool]
host: str # obrigatório se usar Required[] em padrões parciaisTypedDict não proíbe chaves desconhecidas, a menos que seja um TypedDict fechado (recursos do PEP 728+ variam). Correção: Valide externamente.TypedDict permanece dict para APIs que esperam Mapping. Correção: Escolha com base no consumidor.mypy captura user["emial"]; o tempo de execução ainda gera KeyError. Correção: Verificação estática + testes.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Pydantic BaseModel | Validação HTTP | Acesso a dict em loop rápido |
| dataclass | Métodos + padrões | Deve permanecer dict |
| attrs | Ecossistema attrs | Mínimo da biblioteca padrão |
| plain dict[str, Any] | Apenas protótipo | API de produção |
TypedDict quando o valor deve permanecer dict (APIs JSON). dataclass para objetos de domínio com comportamento.
NamedTuple para semântica de tupla mais leve; frozen dataclass quando padrões e métodos são necessários.
total=False no dicionário inteiro ou NotRequired por chave em 3.11+.
Componha TypedDict menores como tipos de campo - espelha o aninhamento JSON.
Mapeamento manual ou camadas de ponte model_validate do Pydantic.
Anote no corpo da classe - NamedTuple suporta anotações PEP 526.
Não é um tipo em tempo de execução - isinstance verifica apenas dict. Use uma biblioteca de validação.
Converta linhas para TypedDict após validar que as chaves obrigatórias estão presentes.
O filho pode adicionar chaves opcionais; entenda as regras de chaves obrigatórias na herança.
Pydantic é preferível para OpenAPI; TypedDict para contratos de dict de serviço interno.
dict restritosVersões das Pilhas: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 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+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026