🏷️
Type Hints — 런타임에서는 아무것도 안 한다
Python의 타입 힌트가 "힌트"인 이유와, Pydantic이 이걸 극복하는 방법
def add(a: int, b: int) -> int:
return a + b
add('hello', 'world') # 에러 안 난다! 'helloworld' 반환
Python 런타임은 type hint를 완전히 무시한다. __annotations__ 딕셔너리에 저장만 하고, 검사하지 않는다. 이건 설계 결정이다 — 동적 타이핑의 유연성을 유지하면서 도구 지원을 추가한 것.
그럼 뭐에 쓰는가
- mypy/pyright — 코드 실행 전에 타입 불일치를 잡아준다. CI에서 돌리면 런타임 에러를 미리 방지.
- IDE 자동완성 — VS Code가
.을 누르면 해당 타입의 메서드를 보여준다. - 문서화 — 코드를 읽는 사람이 인자/반환 타입을 즉시 파악.
Pydantic이 런타임 타입 검사를 하는 방법
FastAPI의 핵심 의존성인 Pydantic은 타입 힌트를 런타임에 검사한다.
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
User(name='Kim', age='not_a_number') # ValidationError 발생!
Pydantic v2는 Rust로 작성된 pydantic-core에서 검증 로직을 실행한다. __annotations__를 읽어서 각 필드의 타입에 맞는 validator를 생성하고, __init__에서 값을 넣을 때 검증한다.
결국 Python의 type hint 자체는 아무것도 안 하지만, Pydantic이 그 "아무것도 안 하는" 메타데이터를 읽어서 런타임 검증을 구축하는 구조다.
핵심 포인트
1
Python 런타임은 type hint를 무시한다 — __annotations__에 저장만
2
mypy/pyright가 정적으로 타입 불일치를 잡아준다
3
Pydantic은 __annotations__를 읽어서 런타임 검증을 구축
4
FastAPI는 Pydantic을 통해 요청 데이터의 타입을 자동 검증
사용 사례
CI에 mypy 연동 — 타입 에러를 배포 전에 잡기
FastAPI + Pydantic — 요청/응답의 런타임 타입 검증