typing.overload descreve várias assinaturas de uma mesma função para o verificador estático. Ele é útil quando o tipo retornado depende do tipo ou da combinação dos argumentos e uma união simples perderia essa relação.
from typing import overload
@overload
def normalizar(valor: str) -> str: ...
@overload
def normalizar(valor: bytes) -> bytes: ...
def normalizar(valor: str | bytes) -> str | bytes:
return valor.strip().lower()
texto = normalizar(" Python ")
dados = normalizar(b" API ")
As declarações com @overload terminam em ... e vêm imediatamente antes de uma implementação concreta. Em runtime, a última função trata todos os casos; por isso ela ainda precisa validar entradas e manter comportamento coerente com cada assinatura publicada.
Boas práticas
Ordene assinaturas específicas antes das amplas e evite sobreposições impossíveis de distinguir. Teste também a implementação, pois o type checker não prova a lógica em runtime. Se um TypeVar expressar a relação de entrada e saída de forma mais curta, prefira-o; overloads extensas elevam o custo de manutenção.
Revise o guia de type hints e use mypy para conferir as assinaturas no projeto.
A documentação oficial de typing.overload, consultada em 22 de julho de 2026, detalha a API e seus limites.