typing.overload describe varias firmas de una función para el verificador estático. Es útil cuando el retorno depende del tipo o combinación de argumentos y una unión simple perdería esa relación.

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 ")

Las declaraciones con @overload terminan en ... y preceden a una implementación concreta. En runtime, la función final atiende todos los casos, por lo que debe validar entradas y cumplir cada firma publicada.

Buenas prácticas

Ordena firmas específicas antes que las amplias y evita solapamientos imposibles de distinguir. Prueba la implementación, porque el type checker no demuestra la lógica en runtime. Prefiere TypeVar si expresa la relación de forma más breve; demasiados overloads aumentan el mantenimiento.

Repasa la guía de type hints y usa mypy para comprobar las firmas.

La documentación oficial de typing.overload, consultada el 22 de julio de 2026, detalla la API y sus límites.