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.

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ípicaO que significaComo corrigir
incompatible typePassou um tipo onde outro era esperadoAjuste o valor ou a anotação
has no attributeChamou algo que o tipo não temVerifique o tipo real do objeto
None não tratadoUsou um valor X | None sem checar NoneAdicione um if valor is not None
missing returnFaltou retornar em algum caminhoGaranta 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))         # Anonimo

Tratar 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.