Módulo 2 - Tipagem estática

Type hints: o contrato explícito

9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

Velocidade

O que você vai aprender

  • Anotar parâmetros e retorno com a sintaxe nome: tipo e -> tipo.
  • Entender que o Python não impõe os tipos em tempo de execução.
  • Anotar variáveis e usar os tipos básicos int, str, float, bool.
  • Perceber como os type hints documentam o contrato da função.

A sintaxe dos type hints

Um type hint é uma anotação que diz qual tipo você espera. A sintaxe é direta: depois do nome do parâmetro você escreve dois pontos e o tipo, e depois da lista de parâmetros você usa uma seta para anotar o retorno. Nada além disso muda na função. Ela continua rodando igual, porque o Python lê essas anotações e as guarda, mas não obriga o valor a seguir o tipo. É por isso que os type hints são chamados de gradual typing: você adiciona onde quer, na medida em que quer.

def area_retangulo(base: float, altura: float) -> float:
    return base * altura

def saudar(nome: str, formal: bool = False) -> str:
    if formal:
        return f"Prezado(a) {nome}"
    return f"Oi, {nome}"

print(area_retangulo(3.0, 4.0))  # 12.0
print(saudar("Ana"))            # Oi, Ana
print(saudar("Dr. Silva", True))  # Prezado(a) Dr. Silva

Parâmetros anotados com : tipo e retorno com -> tipo. O default convive com o hint.

Repare que um parâmetro com valor padrão convive com a anotação: escreve-se formal: bool = False, ou seja, o tipo vem antes do sinal de igual. A ordem é sempre nome, depois tipo, depois valor padrão. Essa é a base de tudo que vem a seguir no módulo; os tipos mais elaborados, como listas de inteiros ou valores opcionais, apenas trocam a parte do tipo por algo mais expressivo.

Tipos básicos e anotação de variáveis

Os tipos mais simples são os próprios tipos embutidos: int para inteiros, float para decimais, str para texto, bool para verdadeiro ou falso. Você também pode anotar uma variável, não só um parâmetro, escrevendo o nome, dois pontos e o tipo. Isso é útil quando o valor inicial não deixa o tipo óbvio, ou quando você quer declarar uma variável antes de atribuir. O mypy usa essas anotações para conferir o resto do código.

total: int = 0
nome: str = "Ana"
preco: float = 19.9
ativo: bool = True

# Anotar sem atribuir de imediato tambem vale:
resultado: float
resultado = total * preco
print(resultado)  # 0.0

Variáveis anotadas com : tipo. A anotação pode vir antes da atribuição.

Sem type hints

  • def calcular(a, b): você adivinha os tipos
  • O erro de tipo só aparece ao rodar, se aparecer
  • O editor sugere pouco sobre o parâmetro
  • O contrato mora na sua cabeça ou num comentário

Com type hints

  • def calcular(a: float, b: float) -> float: tipos explícitos
  • O mypy aponta a incoerência antes de rodar
  • O editor autocompleta com base no tipo
  • O contrato está na própria assinatura, verificável

O que o Python faz com as anotações

Vale insistir neste ponto porque ele confunde muita gente. Em tempo de execução, o Python não verifica os type hints. Se você anotar idade: int e passar o texto trinta, o programa roda até algo dar errado por outro motivo. As anotações ficam guardadas no atributo __annotations__ da função e servem para três públicos: você, que lê o contrato; o editor, que autocompleta e avisa; e o mypy, que confere sem rodar. Nenhum deles muda o comportamento em execução.

Essa separação é saudável. O type hint cuida da coerência do seu código: garantir que uma função que espera número não receba texto por engano de outra parte do programa. A validação de dados de fora, como o que vem de um formulário, continua sendo trabalho seu, com ifs e mensagens claras. Um não substitui o outro. Com essa base firme, a próxima aula abre o módulo typing, que dá nomes a tipos mais ricos, como listas de inteiros e valores opcionais.

Teste rápido

O que o Python faz com um type hint como idade: int em tempo de execução?

Perguntas frequentes

Type hints deixam o programa mais lento?
Praticamente não. A anotação é processada quando a função é definida e guardada em __annotations__, um custo mínimo e único. Em tempo de execução o Python não fica verificando tipos, então o desempenho do corpo da função é o mesmo com ou sem anotações.
Preciso anotar absolutamente tudo?
Não. A tipagem em Python é gradual: você anota onde traz mais clareza, geralmente as assinaturas de funções e as estruturas de dados importantes. Variáveis locais óbvias, como um contador i = 0, raramente precisam de anotação. Comece pelas fronteiras entre partes do código.
Qual a diferença entre float e int na anotação?
int representa números inteiros, como 3 ou 42; float representa números com casas decimais, como 3.14. Ao anotar um preço ou uma média você costuma usar float; ao anotar uma quantidade de itens ou uma idade, int. O mypy avisa se você misturar de forma incoerente.
Posso anotar o tipo de retorno como nada quando a função não retorna?
Sim. Uma função que só executa uma ação e não devolve valor tem o retorno None. Anota-se com -> None, por exemplo def salvar(dado: str) -> None. Isso deixa claro que quem chama não deve esperar um valor de volta.
O que é aquele __annotations__ que você mencionou?
É um dicionário que o Python cria em cada função anotada, mapeando cada parâmetro e o retorno ao tipo declarado. Você quase nunca mexe nele à mão, mas é onde as anotações vivem. Ferramentas de tipos e algumas bibliotecas leem esse dicionário para trabalhar.
Type hints funcionam em versões antigas do Python?
A sintaxe básica existe desde o Python 3.5. Recursos mais novos, como escrever list[int] em vez de List[int] com letra maiúscula, chegaram no 3.9. Como o curso usa versões atuais, você pode escrever os tipos embutidos em minúsculas sem preocupação.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.