Python 은 함수 오버로딩 없음 — 의도적
Java/C++ 는 같은 이름 + 다른 파라미터 타입의 여러 함수 선언 가능 — 컴파일러가 맞는 거 선택. Python 은 X. 같은 이름의 def f(...) 둘 정의하면 첫 번째 조용히 교체. Python 의 동적 타입 철학과 일관 — 정의 시점에 타입 모름.
functools.singledispatch — 첫 인자 타입 기반 dispatch
표준 라이브러리가 가장 흔한 경우용 singledispatch 제공 — 첫 인자 타입에 따라 dispatch. 일반 함수 데코레이트, 그 다음 타입별 특화 버전 등록. "같은 논리적 연산의 다른 형식" (이 dict 처리, 이 list 처리, 이 DataFrame 처리) 에 깔끔.
typing.overload — 정적 체크용 시그니처
@typing.overload 는 런타임 동작 전혀 안 바꿔. 순전히 타입 체커와 IDE 용 — 여러 시그니처 선언, 그 다음 진짜 구현 하나. 함수가 다른 반환 타입 만드는 여러 호출 모양 가질 때 유용. 순수 문서 + 도구 지원.
match — 구조 기반 런타임 dispatch
match 문 (flow 트랙에서) 이 값 타입 아닌 *구조* 기반 선택일 때 가장 깔끔한 런타임 dispatch. 모양 기반 오버로딩엔 match 가 종종 가장 읽기 좋은 답.
원칙:
if isinstance(x, A): ... elif isinstance(x, B): ... 짜고 있으면 — 그게 타입 기반 오버로딩, singledispatch 가 보통 더 깔끔한 표현. 모양 기반 dispatch (3 개짜리 list vs 이 키 가진 dict) 면 match.