Python Type Hints — FastAPI 공식 가이드
학습 목표 매핑
SKALA 3기 Module 1 — Python AI Native (Learning Objective 1-1)
- Objective: Python 타입 힌트(type hints)를 함수·클래스에 적용하고, IDE 자동완성·검증 도구 활용하여 모든 함수 파라미터·반환값에 타입 명시 (Bloom L2-L3)
- Evaluation: 코드 리뷰 (타입 커버리지 90% 이상)
타입 힌트 개요
정의
**타입 힌트(Type Hints)**는 변수, 함수 매개변수, 반환값의 타입을 선언하는 특수한 구문입니다.
효과:
- ✅ 에디터와 도구의 자동완성 지원
- ✅ 오류 검사 및 타입 검증
- ✅ 코드 문서화 및 가독성 향상
- ✅ IDE의 smart hints 제공
기본 문법
콜론(:)을 사용하여 타입 선언 (등호 아님):
def get_full_name(first_name: str, last_name: str) -> str:
full_name = first_name.title() + " " + last_name.title()
return full_name구조:
first_name: str— 매개변수 타입->— 반환 타입 지시str— 반환값 타입
기본 타입들
Simple Types (단순 내장 타입)
def process_data(
name: str, # 문자열
age: int, # 정수
height: float, # 실수
is_active: bool, # 불린
data: bytes # 바이트
) -> None: # 반환값 없음
passGeneric Types (제네릭 타입)
List (리스트)
def process_items(items: list[str]) -> int:
# IDE는 items의 각 원소가 str임을 인식
# → 자동완성에서 str의 메서드만 제안
for item in items:
print(item.upper()) # ✅ IDE가 str 메서드 제안
return len(items)Tuple (튜플)
def get_coordinates() -> tuple[int, int, str]:
# 정확히 3개 요소: int, int, str
return (10, 20, "label")Dict (딕셔너리)
def process_prices(prices: dict[str, float]) -> None:
# 키: str (상품명), 값: float (가격)
for item_name, price in prices.items():
print(f"{item_name}: ${price}")Set (집합)
def get_unique_ids(ids: set[int]) -> None:
for id in ids:
print(id)Union Types (여러 타입 지원)
def process_item(item: int | str) -> None:
# int 또는 str 모두 허용
print(item)
def greet(name: str | None = None) -> None:
# str 또는 None (기본값: None)
if name is not None:
print(f"Hello {name}!")
else:
print("Hello World!")클래스를 타입으로 사용
class Person:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def get_person_name(one_person: Person) -> str:
# Person 클래스의 인스턴스만 허용
return one_person.namePydantic과의 연동
FastAPI의 핵심인 Pydantic을 사용한 데이터 검증:
from datetime import datetime
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = "John Doe" # 기본값 설정
signup_ts: datetime | None = None # Optional
friends: list[int] = [] # 기본값 (빈 리스트)
# 자동 검증 및 타입 변환
external_data = {
"id": "123", # 문자열 → 정수 변환
"signup_ts": "2017-06-01 12:22", # 문자열 → datetime 변환
"friends": [1, "2", b"3"], # 유형 정규화
}
user = User(**external_data)
print(user)
# User(
# id=123,
# name='John Doe',
# signup_ts=datetime(2017, 6, 1, 12, 22),
# friends=[1, 2, 3]
# )Annotated로 메타데이터 추가
from typing import Annotated
def say_hello(
name: Annotated[str, "this is just metadata"]
) -> str:
return f"Hello {name}"FastAPI에서의 활용
FastAPI는 타입 힌트를 다음에 사용합니다:
| 용도 | 설명 |
|---|---|
| 요구사항 정의 | 경로 매개변수, 쿼리 매개변수, 헤더, 바디 등 |
| 데이터 변환 | 요청 데이터를 적절한 타입으로 자동 변환 |
| 데이터 검증 | 유효하지 않은 데이터에 자동 오류 반환 |
| API 문서화 | OpenAPI를 통한 자동 문서 생성 (Swagger UI) |
IDE 자동완성 설정
PyCharm / VS Code 설정:
- Python 인터프리터 설정
- “Editor → Code Completion” 활성화
- 타입 힌트 추가 → IDE가 자동으로 제안
효과:
# 타입 힌트 있음 ✅
user: User = User(...)
user.n # IDE 제안: name, ...
user.name.upper() # IDE는 str 메서드만 제안
# 타입 힌트 없음 ❌
user = User(...)
user.n # IDE가 제안 불가학습 설계 포인트
Cognitive Level (Bloom)
- L2 (Understand): 타입 힌트 문법 이해, 기본 타입 인식
- L3 (Apply): 함수·클래스에 타입 힌트 적용
권장 실습
- 점진적 추가: 간단한 함수부터 타입 힌트 추가
- IDE 검증: IDE에서 오류 표시 확인
- 코드 리뷰: 팀 코드에서 타입 힌트 90% 이상 적용
도구
- mypy: 정적 타입 검사 (
pip install mypy) - pyright: VS Code 내장 타입 검사
- IDE built-in: PyCharm, VS Code 자동완성
참고
- Python typing 공식: https://docs.python.org/ko/3/library/typing.html
- FastAPI 타입: https://fastapi.tiangolo.com/ko/python-types/
- PEP 484: https://www.python.org/dev/peps/pep-0484/
선행 개념
이 개념을 배우기 전에 필수로 알아야 할 것:
- Module 1-1 이전: 없음 (이것이 Module 1의 첫 번째 학습목표)
- Python 기본 문법: 함수, 매개변수, 반환값 개념 (고등학교 프로그래밍 수준)
후속 개념 (이 개념이 선행)
이 개념을 배운 후 다음 단계:
- Module 1-4 → pydantic-validation-velog: 타입 힌트와 Pydantic 검증 통합
- 예:
def create_user(user: UserModel) -> UserModel패턴에서 타입 힌트로 request/response 명시
- 예:
- Module 4-1 → fastapi-docker-official-deployment: FastAPI의 타입 기반 자동 검증·문서화
- 예:
@app.post("/users/")엔드포인트에서 타입 힌트로 요청 바디 검증
- 예:
타 소스와의 연계
pydantic-validation-velog (데이터 검증 - 타입 힌트의 실제 사용) python-asyncio-daleseo (비동기 함수 타입 힌트)