Módulo 2 - Tipagem estática
mypy na prática e quando tipar
9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Instalar o mypy com pip e rodá-lo sobre um arquivo.
- Ler e interpretar os erros mais comuns do mypy.
- Corrigir incoerências de tipo apontadas pela ferramenta.
- Decidir quando tipar compensa e quando é excesso.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: mypy na prática e quando tipar.
Os objetivos desta aula. Instalar o mypy com pip e rodá-lo sobre um arquivo. Ler e interpretar os erros mais comuns do mypy. Corrigir incoerências de tipo apontadas pela ferramenta. Decidir quando tipar compensa e quando é excesso.
Veja o essencial, parte por parte.
Instalar e rodar o mypy. Instala-se com pip install mypy e roda-se com mypy arquivo.py.
Os erros mais comuns do mypy. A maioria dos erros do mypy cai em poucos padrões.
Quando vale a pena tipar. A decisão mais importante do módulo não é de sintaxe, é de julgamento.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Instalar e rodar o mypy
O mypy é uma ferramenta separada do Python, instalada com pip, do mesmo jeito que você instalou pacotes no Intermediário. Depois de instalado, você o roda pela linha de comando apontando para um arquivo ou uma pasta. Ele lê o código, sem executar nada, e imprime as incoerências de tipo que encontrar. Quando não acha problema, ele diz que não há erros. É essa checagem, feita antes de rodar, que transforma os type hints de mera documentação em verificação de verdade.
# Arquivo: contas.py
def dobro(valor: int) -> int:
return valor * 2
resultado = dobro("dez") # erro: passou str onde se espera int
print(resultado)
# No terminal:
# pip install mypy
# mypy contas.py
# Saida aproximada:
# contas.py:4: error: Argument 1 to "dobro" has incompatible type "str"; expected "int"O mypy aponta a linha e a incoerência: str passado onde se esperava int.
Repare que o Python rodaria esse arquivo e só quebraria mais adiante, com uma mensagem confusa, ou pior, produziria um resultado errado em silêncio. O mypy pega o problema na origem, apontando a linha exata e explicando que a função dobro esperava um int e recebeu um str. Essa é a diferença entre um erro caçado antes de rodar e um bug descoberto em produção.
Os erros mais comuns do mypy
| Mensagem típica | O que significa | Como corrigir |
|---|---|---|
| incompatible type | Passou um tipo onde outro era esperado | Ajuste o valor ou a anotação |
| has no attribute | Chamou algo que o tipo não tem | Verifique o tipo real do objeto |
| None não tratado | Usou um valor X | None sem checar None | Adicione um if valor is not None |
| missing return | Faltou retornar em algum caminho | Garanta retorno em todos os ramos |
Quatro erros que aparecem cedo e como reagir a cada um.
A maioria dos erros do mypy cai em poucos padrões. O mais comum é o tipo incompatível, quando você passa algo do tipo errado para uma função. Logo depois vem o has no attribute, quando você chama um método que aquele tipo não possui, sinal de que o objeto não é o que você pensava. Muito frequente também é esquecer de tratar o None: se o tipo é X | None e você usa o valor direto, o mypy cobra a checagem. Ler a mensagem com calma quase sempre aponta o conserto.
def primeiro_nome(nome_completo: str | None) -> str:
# Sem tratar None, o mypy reclama: str | None nao tem .split garantido
if nome_completo is None:
return "Anonimo"
return nome_completo.split()[0]
print(primeiro_nome("Ana Silva")) # Ana
print(primeiro_nome(None)) # AnonimoTratar o None com um if antes de usar o valor silencia o erro e evita o bug.
Quando vale a pena tipar
A decisão mais importante do módulo não é de sintaxe, é de julgamento. Tipar tem um custo: leva tempo escrever e manter as anotações. Onde esse custo compensa? Em código que outras pessoas vão usar, como bibliotecas e módulos compartilhados, os tipos são documentação viva e evitam mau uso. Em lógica complexa e cálculos importantes, eles pegam erros cedo. Nas fronteiras entre partes do sistema, deixam os contratos explícitos. Já num script de dez linhas que você roda uma vez e joga fora, tipar é esforço sem retorno.
Vale muito a pena tipar
- Bibliotecas e código que outros vão usar
- Lógica complexa e cálculos sensíveis
- Fronteiras entre módulos e camadas
- Projetos grandes mantidos por muito tempo
Raramente compensa
- Scripts descartáveis de uso único
- Prototipagem rápida que ainda vai mudar muito
- Trechos triviais onde o tipo é óbvio
- Exploração no console para testar uma ideia
A tipagem gradual do Python existe justamente para essa flexibilidade: você adiciona tipos onde eles pagam e deixa de fora onde não pagam. O bom senso é o guia. Comece anotando as assinaturas das funções públicas e as estruturas de dados centrais; deixe o resto para depois, se precisar. Com o mypy conferindo essas partes, você ganha o essencial da segurança de tipos sem transformar cada linha num exercício de anotação. É assim que a tipagem estática vira aliada, e não fardo.
Teste rápido
Em qual situação adicionar type hints traz mais retorno pelo esforço?
Perguntas frequentes
- O mypy roda no Playground do curso?
- O Playground executa Python, mas o mypy é uma ferramenta de linha de comando que você roda no seu computador. Para praticar a verificação de tipos de verdade, instale o mypy com pip e rode sobre um arquivo local. No Playground você ainda vê o código com tipos rodar normalmente.
- Instalar o mypy muda como meu programa roda?
- Não. O mypy é uma ferramenta de verificação, separada da execução. Ele lê o código e aponta problemas de tipo, mas não altera o comportamento do programa quando você o roda com o Python. Você pode instalá-lo e removê-lo sem afetar nada além da checagem.
- O que faço quando o mypy reclama de uma biblioteca sem tipos?
- Algumas bibliotecas ainda não têm anotações, e o mypy avisa. Muitas oferecem pacotes de tipos separados, com nomes que começam por types-, instaláveis via pip. Quando não há, você pode configurar o mypy para ignorar aquela importação específica, um recurso que a documentação oficial detalha.
- Preciso zerar todos os erros do mypy de uma vez?
- Não, e num projeto existente isso seria assustador. O mypy foi feito para adoção gradual: você pode começar verificando poucos arquivos e ampliar aos poucos. Cada erro corrigido é uma classe de bug a menos. Priorize a lógica importante e as fronteiras do sistema.
- Tipar meu código o torna realmente mais seguro?
- Mais seguro contra uma classe específica de erro: passar o tipo errado, esquecer de tratar None, chamar um método que não existe. Isso pega muitos bugs antes de rodar. Não substitui testes nem validação de dados externos, mas soma a eles como uma camada de proteção barata.
- Qual a diferença entre erro do mypy e erro do Python ao rodar?
- O erro do mypy aparece na verificação, antes de executar, e aponta incoerências de tipo. O erro do Python aparece em tempo de execução, quando algo já quebrou. O valor do mypy é justamente antecipar: transformar um bug que só apareceria rodando num aviso que você lê antes.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.