타입 힌트는 실행 중 값을 강제하지 않는다. 도구가 호출 관계를 검사하고 IDE가 자동 완성을 제공하도록 돕는 메타데이터다.

from collections.abc import Iterable

def total(values: Iterable[int]) -> int:
    return sum(values)

def find(name: str) -> int | None:
    ...

입력에는 필요한 최소 인터페이스를 받고, 반환에는 구체 타입을 주는 편이 사용하기 좋다. 읽기만 하는 함수는 `list[int]`보다 `Sequence[int]`나 `Iterable[int]`가 넓다.

`Any`는 검사를 끄고 전파된다. 모르는 타입은 `object`로 받고 `isinstance` 등으로 좁히는 편이 안전하다. `cast`는 런타임 변환이 아니라 검사기에게 하는 주장이다.

타입 별칭은 복잡한 구조에 도메인 이름을 붙이고, `NewType`은 같은 런타임 타입의 식별자를 정적으로 구분한다. 다음 편의 Protocol은 상속 없이 구조적 타입을 표현한다.

Python 18. 타입 힌트와 정적 검사의 핵심 흐름도
그림. 타입 힌트는 도구의 계약이며 외부 입력 검증을 대신하지 않는다.