파이썬 타입 힌트
동적 타입의 부드러운 안전망. IDE 자동완성 + 사전 버그 잡기.
3편에서 파이썬이 동적 타입이라 했죠. age = 30 한 줄에서 자료형이 자동으로 결정. 자유롭지만 함정도 있어요 — "이 함수의 data 인자는 리스트일까 딕셔너리일까" 가 한 달 뒤 본인 코드를 봐도 안 보입니다. 동료 코드는 더해요. 해법은 타입 힌트(type hint, 3.5+) — 강제는 안 하지만 "이 자리에는 int 가 옵니다" 라고 적는 약속입니다.
18편을 마치면 ① 기본 문법(x: int·-> str) ② 컬렉션(list[int]·dict[str, int]) ③ X | None 합집합 ④ mypy 정적 검사 ⑤ VS Code 자동완성 활용 — 5가지를 손에 익힙니다.
기본 문법 — 변수·인자·반환
# 변수
age: int = 30
name: str = "준성"
active: bool = True
# 함수 인자와 반환
def greet(name: str, count: int = 1) -> str:
return f"안녕, {name}" * count
# 클래스 속성 (dataclass 와 연결)
class User:
name: str
age: int = 30
형태: 이름: 타입 또는 함수에서 이름: 타입 = 기본값. 반환은 -> 타입. 실행에는 영향 0 — 어긋난 타입을 넘겨도 파이썬은 그냥 동작합니다(검사하지 않음). 힌트일 뿐.
📌 타입 힌트는 강제가 아닌 문서
greet(name=123) 를 호출해도 파이썬은 안 막아요. 그러면 왜 적나? ① IDE 자동완성·경고가 정확해짐 ② 동료가 함수 시그니처만 보고 무엇을 넘길지 압 ③ mypy 같은 별도 도구가 사전에 버그 탐지. "실행 시간 타입 검사" 가 필요하면 pydantic 같은 라이브러리.
컬렉션 타입 — list[int]·dict[str, Any]
def avg(nums: list[int]) -> float:
return sum(nums) / len(nums)
def header_map(rows: list[dict[str, str]]) -> dict[str, int]:
return {r["name"]: int(r["score"]) for r in rows}
# 튜플 — 위치별 타입 정확히
def stats(nums: list[float]) -> tuple[float, float, float]:
return min(nums), max(nums), sum(nums) / len(nums)
3.9 이전에는 from typing import List, Dict, Tuple 을 import 해 대문자로 적어야 했지만(List[int]), 3.9+ 부터 내장 소문자 그대로. 더 짧고 자연스럽습니다.
X | None·Union — 여러 타입 허용
"문자열이거나 None" 같이 여러 타입을 허용할 때 | 연산자(3.10+).
def find(name: str) -> User | None:
for u in users:
if u.name == name:
return u
return None # 못 찾으면 None
# 옛 방식
from typing import Optional
def find(name: str) -> Optional[User]: ...
# == User | None
# 여러 타입 (3.10+)
def parse(value: int | str | float) -> float:
return float(value)
None 도 타입이라 합집합에 그대로 적습니다. Optional[User] 와 User | None 은 같은 의미.
mypy 정적 검사 — 사전에 버그 잡기
# 터미널에서
$ pip install mypy
$ mypy myapp.py
myapp.py:14: error: Argument 1 to "avg" has incompatible type
"list[str]"; expected "list[int]" [arg-type]
Found 1 error in 1 file
mypy 는 코드를 실행 없이 읽어 타입 위반을 찾아냅니다. 12편의 try/except 와는 다른 안전망 — try 가 런타임에 잡는 거라면 mypy 는 작성 시 잡는 거예요. 단위 테스트와 짝지어 실무 코드 품질을 올립니다.
--strict 모드는 신규 프로젝트에서나 권장.
VS Code 자동완성 + 마무리
VS Code 의 Pylance(파이썬 확장)는 타입 힌트를 읽고 정확한 자동완성을 줍니다. users: list[User] 라고 적어두면 users[0]. 까지 친 순간 User 의 속성·메서드가 다 떠요. 안 적었으면 users[0] 의 자료형을 추론 못 해 자동완성이 흐려집니다.
# 좋은 함수 시그니처 — IDE 가 모든 걸 알려줌
def filter_users(
users: list[User],
min_age: int = 0,
active_only: bool = True,
) -> list[User]:
"""조건에 맞는 사용자만 반환."""
return [u for u in users if u.age >= min_age and (not active_only or u.active)]
이 한 함수만 봐도 입력·출력·기본값이 명확. 동료가 docstring 안 읽어도 90% 사용 가능합니다.
다음 미션 — REPL/파일에서: ① def divide(a: float, b: float) -> float | None — 0 으로 나누면 None ② 14편 Student 클래스에 모든 속성 타입 힌트 추가 ③ mypy 깔고 본인 코드에 돌려보기.
다음 편 미리보기
19편 — "collections·itertools": 표준 라이브러리 고급. Counter·defaultdict·deque·chain·groupby 같은 실무 도구.
← 17편 "데코레이터" · 다음: 19편 "collections·itertools"