# 함수 정의 시 매개변수와 반환값에 타입 힌트를 제공
def myfunction(myparameter: int) -> int:
return myparameter + 10
# 문자열 매개변수를 요구하는 함수
def otherfunction(otherparameter: str):
print(otherparameter)
# 타입에 맞게 사용하면 mypy static checker에 통과
otherfunction(str(myfunction(20))) # 명시적으로 str로 변환해줘야 mypy에서 오류 없음
Type Hinting (타입 힌트) 는 Python 3.5부터 도입된 기능으로, 코드에 타입 정보를 명시해주는 방식이다. (위 코드는 3.9 기준으로 작성된 코드이긴 합니다.)
Python은 동적 타입 언어이지만, 타입 힌트를 통해 더 안전하고 예측 가능한 코드 작성이 가능하다.
mypy
, pyright
, pylance
같은 도구로 타입 검사 가능def greet(name: str, age: int) -> str:
return f"Hello, {name}. You are {age} years old."
name
은 문자열, age
는 정수형 인자만 받을 수 있다.
typing
모듈모듈에서 지원하는 대표적인 타입 힌트 도구이다. -> Optional
, Union
, List
, Dict
from typing import Optional, Union, List, Dict
def say_hello(name: Optional[str] = None) -> str:
return f"Hello, {name or 'Guest'}"
def operate(value: Union[int, float]) -> float:
return value * 2.5
def process_scores(scores: List[int]) -> float:
return sum(scores) / len(scores)
def config(settings: Dict[str, Union[str, int]]) -> None:
for key, val in settings.items():
print(f"{key}: {val}")
from typing import Optional
def greet(name: Optional[str] = None) -> str:
return f"Hello, {name or 'Guest'}"
Optional[X]
는 X
또는 None
을 받을 수 있다는 뜻Optional[X]
는 Union[X, None]
의 축약형name: Optional[str] = None # 가능: None 또는 문자열
name = "Alice" # 가능
name = None # 가능
from typing import Union
def operate(value: Union[int, float]) -> float:
return value * 2.5
value: Union[int, str]
value = 10 # OK
value = "ten" # OK
value = 3.14 # X (float은 안 됨)
from typing import List
def process_scores(scores: List[int]) -> float:
return sum(scores) / len(scores)
List[X]
는 X
타입의 요소들을 갖는 리스트를 뜻함List[int]
는 정수 리스트, List[str]
는 문자열 리스트scores: List[int] = [90, 80, 70] # OK
scores = ["A", "B"] # X (List[str]이 아님)
from typing import Dict, Union
def config(settings: Dict[str, Union[str, int]]) -> None:
for key, val in settings.items():
print(f"{key}: {val}")
Dict[K, V]
는 키와 값의 타입이 각각 K, V인 딕셔너리를 뜻함str
, 값은 str
또는 int
허용settings: Dict[str, Union[str, int]] = {
"version": 1,
"theme": "dark"
}
그 외에 tuple, set, Literal, Any, TypedDict, Callable 등 존재.
mypy main.py
을 통해 타입 검사가 가능하다. 타입 불일치 시 경고 출력 (런타임은 정상 수행 가능)
런타임에 강제되지 않기 때문에 mypy
같은 도구를 사용해야 하고, TypeError
는 타입 힌트와 무관하다.