Python의 타입 추론
•
Python은 동적(Dynamic) 프로그래밍 언어
•
인터프리터(Interpreter)가 코드를 실행하여 타입 추론
•
변수의 타입(Type)은 가변성을 띄고 있다.
타입 어노테이션(TypeScript)
•
파이썬에서 타입의 유연함은 소규모 프로젝트의 애플리케이션을 빠르게 개발할 때 용이
•
but 프로젝트의 규모가 커질 경우 유연함은 버그로 이어질 확률이 높아짐.
•
중규모 이상일 때는 타입 어노테이션/힌트를 이용하여 파이썬 코드의 타입 표시를 표준화함.
변수 타입 어노테이션 ( : )
name: str = "John Doe"
age: int = 25
# 파이썬 3.8 이하
emails: list = ["john1@doe.com", "john2@doe.com"]
# 파이썬 3.9 이상
emails: list[str] = ["john1@doe.com", "john2@doe.com"]
# 파이썬 3.8 이하
address: dict = {
"street": "54560 Daugherty Brooks Suite 581",
"city": "Stokesmouth",
"state": "NM",
"zip": "80556"
}
# 파이썬 3.9 이상
address: dict[str, str] = {
"street": "54560 Daugherty Brooks Suite 581",
"city": "Stokesmouth",
"state": "NM",
"zip": "80556"
}
Python
복사
함수 타입 어노테이션 ( -> )
def stringify(num: int) -> str:
return str(num)
def plus(num1: int, num2: float = 3.5) -> float:
return num1 + num2
def greet(name: str) -> None:
print("Hi! " + name)
# 파이썬 3.8 이하
def repeat(message: str, times: int = 2) -> list:
return [message] * times
# 파이썬 3.9 이상
def repeat(message: str, times: int = 2) -> list[str]:
return [message] * times
Python
복사
특수 타입 어노테이션/힌트
Final
•
최종 사항이라고 생각하면 됨. 번복 불가능.
•
재할당이 불가능한 변수
•
즉, 상수에 대한 타입 어노테이션을 추가할 때 사용
from typing import Final
TIME_OUT: Final[int] = 10
type(TIME_OUT), TIME_OUT
Python
복사
Union
•
연합, 다중 선택 가능 사항
•
여러 개의 타입이 허용될 수 있는 상황에서 사용
•
python 3.9 이하 버전
from typing import Union
def toString(num: Union[int, float]) -> str:
return str(num)
Python
복사
•
python 3.10에서는 | 연산자로 typing 모듈의 Union을 대체할 수 있게 됨
def toString(num: int | float) -> str:
return str(num)
Python
복사
Optional (옵션 사항)
•
차 뽑을 때 옵션 추가 이런 거랑 비슷하다고 생각하면 됨.
•
typing 모듈의 Optional은 None이 허용되는 함수의 매개변수에 대한 타입을 명시할 때 사용
•
Optional[int] === Union[int, None]과 동일
from typing import Optional
def repeat(message: str, times: Optional[int] = None) -> list[str]:
if times:
return [message] * times
else:
return [message]
repeat("hi", 3)
repeat("good")
# 둘다 가능
Python
복사
Callable
•
파이썬에서 함수를 일반값처럼 변수에 저장하거나 함수의 인자로 넘기거나 함수의 반환값으로 사용 가능. → 해당 함수에 대한 타입 어노테이션 기능
•
typing 모듈 소속
•
첫 번째 매개변수[[입력값…], 반환값]
from typing import Callable
def repeat(greet: Callable[[str], str], name: str, times: int = 1) -> None:
for _ in range(times):
print(greet(name))
# 첫 번째 매개 변수에 타입 어노테이션(Callable[[str],str]를 추가하여,
# str 타입의 인자를 하나 받고, 결과값을 str로 반환해줌.
repeat(lambda name: f"Hi, {name}!", "Python", 2)
def add(a: int, b: int) -> int:
return a + b
def foo(func: Callable[[int, int], int]) -> int:
return func(2, 3)
Python
복사
Iterable
•
어떤 함수의 매개 변수에 타입 표시를 해줄 때 추상적으로 명시해주는 것이 유리
•
list, tuple, set 등 처리 가능
from typing import Iterable, List
def toStrings(nums: Iterable[int]) -> List[str]:
return [str(x) for x in nums]
toStrings([1,2,3]) # list
toStrings((1,2,3)) # tuple
toStrings({1,2,3}) # set
Python
복사