🧩 Exercícios: Tipagem e Serialização com Pydantic v2
Spec Backend Com Python E Fastapi • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 02.1 — Schema de Validação com BaseModel e Field Constraints
Contexto: Schema de Validação com BaseModel e Field Constraints no contexto de Tipagem e Serialização com Pydantic v2.
Requisitos de Execução:
- Criar modelo Pydantic
ProdutoSchemacom validações de tamanho mínimo de nome, preço positivo e tags únicas.
Resultado Esperado
Produto válido serializado para JSON com sucesso.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_1_SeuNome - Envie na tarefa:
Atividade Cap 02 - Tipagem e Serialização com Pydantic v2
🔑 Gabarito de Código & Solução Comentada
# schemas.py
from pydantic import BaseModel, Field, field_validator
from typing import List
class ProdutoSchema(BaseModel):
id: int = Field(..., gt=0)
nome: str = Field(..., min_length=3, max_length=100)
preco: float = Field(..., gt=0.0)
tags: List[str] = Field(default_factory=list)
@field_validator("tags")
@classmethod
def validar_tags_unicas(cls, v):
if len(v) != len(set(v)): raise ValueError("Tags não podem ser duplicadas")
return v
p = ProdutoSchema(id=1, nome="Teclado Mecânico", preco=350.0, tags=["hardware", "usb"])
print("Produto:", p.model_dump())
🔍 Nível 2: Prática
Problema 02.2 — Transformação e Serialização Customizada com field_serializer
Contexto: Transformação e Serialização Customizada com field_serializer no contexto de Tipagem e Serialização com Pydantic v2.
Requisitos de Execução:
- Implementar método
@field_serializerpara formatar preço como moeda brasileira (BRL) e mascarar emails.
Resultado Esperado
Preço formatado: 'R$ 1.250,00' | Email mascarado: 'a***e@tech.com'
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_2_SeuNome - Envie na tarefa:
Atividade Cap 02 - Tipagem e Serialização com Pydantic v2
🔑 Gabarito de Código & Solução Comentada
# serializers.py
from pydantic import BaseModel, field_serializer
class ClienteResponse(BaseModel):
nome: str
email: str
saldo: float
@field_serializer("email")
def mascarar_email(self, email: str) -> str:
partes = email.split("@")
return f"{partes[0][0]}***{partes[0][-1]}@{partes[1]}"
c = ClienteResponse(nome="Alice", email="alice@tech.com", saldo=1250.0)
print(c.model_dump())
⚡ Nível 3: Integração
Problema 02.3 — Validação Cruzada Multi-campo com model_validator
Contexto: Validação Cruzada Multi-campo com model_validator no contexto de Tipagem e Serialização com Pydantic v2.
Requisitos de Execução:
- Criar validador de modelo
model_validator(mode='after')que confira se adata_fimé estritamente posterior àdata_inicio.
Resultado Esperado
Validação de intervalo de datas executada com sucesso.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_3_SeuNome - Envie na tarefa:
Atividade Cap 02 - Tipagem e Serialização com Pydantic v2
🔑 Gabarito de Código & Solução Comentada
# date_range_validator.py
from pydantic import BaseModel, model_validator
from datetime import date
class EventoSchema(BaseModel):
nome: str
data_inicio: date
data_fim: date
@model_validator(mode="after")
def validar_intervalo_datas(self):
if self.data_fim < self.data_inicio:
raise ValueError("data_fim deve ser posterior a data_inicio")
return self
ev = EventoSchema(nome="Conferência Tech", data_inicio=date(2026, 9, 1), data_fim=date(2026, 9, 3))
print("Evento Válido:", ev.nome)
🏆 Nível 4: Desafio Corporativo
Problema 02.4 — Imutabilidade e Configuração Estrita com ConfigDict
Contexto: Imutabilidade e Configuração Estrita com ConfigDict no contexto de Tipagem e Serialização com Pydantic v2.
Requisitos de Execução:
- Configurar Pydantic com
frozen=True,extra='forbid'estr_strip_whitespace=Truepara segurança corporativa máxima.
Resultado Esperado
Imutabilidade validada: Alteração de atributo bloqueada com ValidationError.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_4_SeuNome - Envie na tarefa:
Atividade Cap 02 - Tipagem e Serialização com Pydantic v2
🔑 Gabarito de Código & Solução Comentada
# strict_settings.py
from pydantic import BaseModel, ConfigDict, ValidationError
class TokenPayload(BaseModel):
model_config = ConfigDict(frozen=True, extra="forbid", str_strip_whitespace=True)
sub: str
role: str
exp: int
t = TokenPayload(sub="user_42", role="ADMIN", exp=1780000000)
print("Token Congelado:", t.sub)