@overload defines multiple signatures for a function (for type checkers).
1from typing import overload23@overload4def process(value: int) -> int: ...56@overload7def process(value: str) -> str: ...89@overload10def process(value: list) -> list: ...1112def process(value):13 if isinstance(value, int):14 return value * 215 elif isinstance(value, str):16 return value.upper()17 elif isinstance(value, list):18 return [process(item) for item in value]19 raise TypeError(f"Unsupported type: {type(value)}")2021# Type checker understands:22process(5) # returns int23process("hello") # returns str24process([1, 2]) # returns list2526# With FastAPI27from fastapi import FastAPI2829app = FastAPI()3031@overload32async def get_user(user_id: int) -> User: ...3334@overload35async def get_user(email: str) -> User: ...3637async def get_user(user_id_or_email):38 if isinstance(user_id_or_email, int):39 return await db.get(User, user_id_or_email)40 return await db.get(User, email=user_id_or_email)
Rules: