Pydantic: Validação de Dados Moderna em Python com Exemplos Práticos

Introdução
Quando trabalhamos com APIs, pipelines de dados, aplicações web, automações ou sistemas distribuídos em Python, uma das maiores dores é garantir que os dados recebidos estejam corretos.
Imagine alguns cenários:
- Um usuário envia um e-mail inválido.
- Uma API retorna um campo nulo inesperado.
- Um pipeline recebe uma string onde deveria existir um número.
- Um microserviço envia dados incompletos.
Esses problemas podem gerar falhas silenciosas, erros difíceis de rastrear e até inconsistências graves no sistema.
É exatamente nesse contexto que o Pydantic se tornou uma das bibliotecas mais importantes do ecossistema Python moderno.
O Pydantic permite:
- Validar dados automaticamente
- Converter tipos automaticamente
- Garantir consistência de entrada
- Facilitar integração com APIs
- Criar modelos fortemente tipados
- Reduzir código boilerplate
- Melhorar a legibilidade e manutenção do código
Hoje o Pydantic é amplamente utilizado em frameworks e plataformas como:
- FastAPI
- LangChain
- CrewAI
- Sistemas de IA
- Engenharia de Dados
- Microsserviços
- ETL e pipelines
Neste artigo vamos aprender:
- O que é Pydantic
- Como instalar
- Como criar modelos
- Como validar dados
- Conversão automática de tipos
- Campos opcionais
- Validators
- Nested Models
- Serialização
- Configurações avançadas
- Exemplos reais e práticos
O que é o Pydantic?
O Pydantic é uma biblioteca Python utilizada para:
- Validação de dados
- Parsing de dados
- Conversão de tipos
- Definição de schemas
Ele utiliza as famosas Type Hints do Python.
Exemplo:
nome: str
idade: int
A partir dessas definições, o Pydantic valida automaticamente os dados.
Instalação
Instalando com pip
pip install pydantic
Verificando instalação
import pydantic
print(pydantic.__version__)
Primeiro Exemplo
Vamos criar nosso primeiro modelo.
from pydantic import BaseModel
class Usuario(BaseModel):
nome: str
idade: int
usuario = Usuario(
nome="Rafael",
idade=30
)
print(usuario)
Saída:
nome='Rafael' idade=30
Conversão Automática de Tipos
Um dos recursos mais interessantes do Pydantic é o parsing automático.
from pydantic import BaseModel
class Produto(BaseModel):
nome: str
preco: float
quantidade: int
produto = Produto(
nome="Notebook",
preco="5999.90",
quantidade="10"
)
print(produto)
print(type(produto.preco))
print(type(produto.quantidade))
Saída:
nome='Notebook' preco=5999.9 quantidade=10
<class 'float'>
<class 'int'>
Mesmo enviando strings, o Pydantic converte automaticamente.
Tratamento de Erros
Agora vamos provocar um erro.
from pydantic import BaseModel
class Pessoa(BaseModel):
nome: str
idade: int
pessoa = Pessoa(
nome="Maria",
idade="vinte"
)
Saída:
ValidationError: 1 validation error for Pessoa
idade
Input should be a valid integer
O Pydantic gera mensagens extremamente detalhadas.
Isso é excelente para:
- APIs
- Logs
- Debug
- Sistemas distribuídos
Campos Opcionais
Nem todos os campos precisam ser obrigatórios.
from typing import Optional
from pydantic import BaseModel
class Cliente(BaseModel):
nome: str
email: Optional[str] = None
cliente = Cliente(nome="João")
print(cliente)
Saída:
nome='João' email=None
Valores Padrão
from pydantic import BaseModel
class Pedido(BaseModel):
status: str = "PENDENTE"
valor: float
pedido = Pedido(valor=150.0)
print(pedido)
Saída:
status='PENDENTE' valor=150.0
Validação com Email
O Pydantic possui tipos especiais.
pip install email-validator
Exemplo:
from pydantic import BaseModel, EmailStr
class Usuario(BaseModel):
nome: str
email: EmailStr
usuario = Usuario(
nome="Rafael",
email="rafael@email.com"
)
print(usuario)
Agora um exemplo inválido:
usuario = Usuario(
nome="Rafael",
email="email_invalido"
)
Saída:
ValidationError: value is not a valid email address
Validators Personalizados
Você pode criar suas próprias regras.
Exemplo: validar idade mínima
from pydantic import BaseModel, field_validator
class Usuario(BaseModel):
nome: str
idade: int
@field_validator("idade")
@classmethod
def validar_idade(cls, value):
if value < 18:
raise ValueError("Usuário deve ser maior de idade")
return value
usuario = Usuario(
nome="Carlos",
idade=25
)
print(usuario)
Agora um caso inválido:
usuario = Usuario(
nome="Pedro",
idade=15
)
Saída:
ValidationError: Usuário deve ser maior de idade
Nested Models
O Pydantic suporta objetos aninhados.
Exemplo com Endereço
from pydantic import BaseModel
class Endereco(BaseModel):
rua: str
cidade: str
estado: str
class Usuario(BaseModel):
nome: str
endereco: Endereco
usuario = Usuario(
nome="Rafael",
endereco={
"rua": "Rua A",
"cidade": "São Paulo",
"estado": "SP"
}
)
print(usuario)
Saída:
nome='Rafael' endereco=Endereco(rua='Rua A', cidade='São Paulo', estado='SP')
Trabalhando com Listas
from typing import List
from pydantic import BaseModel
class Pedido(BaseModel):
produtos: List[str]
pedido = Pedido(
produtos=["Notebook", "Mouse", "Teclado"]
)
print(pedido)
Serialização JSON
Transformar objetos em JSON é extremamente comum.
from pydantic import BaseModel
class Produto(BaseModel):
nome: str
preco: float
produto = Produto(
nome="Notebook",
preco=4500
)
print(produto.model_dump())
print(produto.model_dump_json())
Saída:
{'nome': 'Notebook', 'preco': 4500.0}
{"nome":"Notebook","preco":4500.0}
Alias de Campos
Muito útil quando APIs utilizam nomes diferentes.
from pydantic import BaseModel, Field
class Usuario(BaseModel):
nome_completo: str = Field(alias="full_name")
usuario = Usuario(full_name="Rafael Sanches")
print(usuario)
Configurações do Modelo
Exemplo: bloquear campos extras
from pydantic import BaseModel, ConfigDict
class Usuario(BaseModel):
model_config = ConfigDict(extra="forbid")
nome: str
usuario = Usuario(
nome="Rafael",
idade=30
)
Saída:
ValidationError: Extra inputs are not permitted
Exemplo Real: API com FastAPI
O FastAPI utiliza Pydantic internamente.
Instalação
pip install fastapi uvicorn
Exemplo Completo
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Usuario(BaseModel):
nome: str
email: str
idade: int
@app.post("/usuarios")
def criar_usuario(usuario: Usuario):
return {
"mensagem": "Usuário criado com sucesso",
"dados": usuario
}
Executando:
uvicorn main:app --reload
Agora o FastAPI:
- valida automaticamente
- gera documentação
- cria schemas
- valida JSON
- retorna erros estruturados
Exemplo Prático: Pipeline de Dados
Imagine um pipeline recebendo dados CSV.
from pydantic import BaseModel
class Venda(BaseModel):
produto: str
valor: float
quantidade: int
registro = {
"produto": "Notebook",
"valor": "5000",
"quantidade": "2"
}
venda = Venda(**registro)
print(venda)
Isso ajuda muito em:
- Data Engineering
- ETL
- Data Quality
- APIs
- Integração de sistemas
Exemplo Prático: IA e Multiagentes
Hoje muitas aplicações de IA usam Pydantic.
Exemplo simples:
from pydantic import BaseModel
class RespostaIA(BaseModel):
titulo: str
resumo: str
score: float
Isso permite:
- Estruturar respostas
- Garantir consistência
- Validar outputs de LLMs
- Integrar agentes
Ferramentas como:
- LangChain
- CrewAI
- AutoGen
- LlamaIndex
utilizam bastante Pydantic.
Diferença entre Dataclass e Pydantic
Dataclass
from dataclasses import dataclass
@dataclass
class Usuario:
nome: str
idade: int
Dataclass:
- Organiza dados
- Não valida automaticamente
Pydantic
from pydantic import BaseModel
class Usuario(BaseModel):
nome: str
idade: int
Pydantic:
- Organiza dados
- Valida dados
- Converte tipos
- Gera erros estruturados
Principais Benefícios do Pydantic
1. Código mais seguro
Menos bugs relacionados a tipos.
2. APIs mais robustas
Validação automática.
3. Melhor manutenção
Schemas claros.
4. Excelente integração
Funciona perfeitamente com:
- FastAPI
- IA
- Engenharia de Dados
- Microsserviços
5. Redução de boilerplate
Menos código manual.
Boas Práticas
Utilize Type Hints corretamente
nome: str
idade: int
ativo: bool
Crie modelos pequenos
Evite modelos gigantes.
Reutilize modelos
class Endereco(BaseModel):
...
Valide regras de negócio
Use validators.
Evite lógica excessiva dentro dos modelos
Mantenha foco em validação.
Quando Utilizar Pydantic?
O Pydantic é excelente para:
- APIs REST
- Microsserviços
- Engenharia de Dados
- Data Mesh
- IA Generativa
- Sistemas Multiagentes
- ETL
- Processamento de eventos
- Integração entre sistemas
- Automação
Conclusão
O Pydantic se tornou praticamente um padrão no ecossistema Python moderno.
Ele resolve um problema extremamente comum:
garantir que os dados estejam corretos.
Além disso, ele torna o código:
- Mais limpo
- Mais seguro
- Mais legível
- Mais profissional
Se você trabalha com:
- FastAPI
- IA
- Engenharia de Dados
- APIs
- Microsserviços
- ETL
aprender Pydantic é praticamente obrigatório.
Próximos Passos
Agora que você conhece os fundamentos do Pydantic, experimente:
- Criar APIs com FastAPI
- Validar dados de pipelines
- Integrar com CrewAI
- Criar modelos para IA
- Estruturar outputs de LLMs
- Construir validações avançadas
Desafio Prático
Crie um sistema simples de cadastro de produtos usando Pydantic com:
- Nome
- Preço
- Quantidade
- Categoria
- Validação de preço positivo
- Validação de estoque mínimo
Depois tente:
- Converter para API FastAPI
- Persistir em banco
- Criar testes automatizados