모델 구성할 때, typing 으로 타입을 명시해주는 케이스가 자주 발견돼서 따로 정리함

파이썬 = 동적 프로그래밍 언어

>>> a = 1
>>> type(a)
<class 'int'>

변수의 타입을 동적으로 바꿀 수 있는 파이썬은 동적 프로그래밍 언어

반면 자바는?

int a = 1  // a 변수를 int형으로 지정
a = "1";  // a 변수를 문자열을 대입할 수 없으므로 컴파일 에러

한 번 변수에 타입을 지정하면 지정한 타입 외에 다른 타입은 사용할 수 없으므로 정적 프로그래밍 언어

Type Annotation

num: int = 1
def add(a: int, b: int) -> int:
  return a+b

매개변수의 타입을 명시할 수 있음. 또한 함수의 반환값도 -> 타입 처럼 사용하여 반환값의 타입을 명시할 수 있다.

annotation type으로 정수는 int, 문자열은 str, 리스트는 list, 튜플은 tuple, 딕셔너리는 dict, 집합은 set, 불리언은 bool을 사용

Typing

List, Dict, Tuple, Set

타입 어노테이션을 사용하다 보면 리스트, 사전, 튜플, 세트와 같은 파이썬 내장 자료 구조에 대한 타입을 명시해야 할 때가 있기에 typing 모듈에서 제공하는 아래의 것들을 사용하여 타입 어노테이션을 추가

from typing import Union, List, Tuple, Optional, Dict, Set, Iterable
>>> nums: List[int] = [1, 2, 3]

[1, 2, 3]
<class 'list'>
>>> countries: Dict[str, str] = {"KR": "South Korea", "US": "United States"}

{'KR': 'South Korea', 'US': 'United States'}
<class 'dict'>
>>> user: Tuple[int, str, bool] = (3, 'Dale', True)

(3, 'Dale', True)
<class 'tuple'>
>>> chars: Set[str] = {'A', 'B', 'C'}

{'A', 'C', 'B'}
<class 'set'>

Union

여러 개의 타입이 허용될 수 있는 상황에서는 typing 모듈의 Union을 사용할 수 있음

def toString(num: Union[int, float]) -> str:
    return str(num)

>>> toString(1)
'1'
>>> toString(1.5)
'1.5'

Optional

typing 모듈의 OptionalNone이 허용되는 함수의 매개 변수에 대한 타입을 명시할 때 유용하다.

def repeat(message: str, times: Optional[int] = None) -> list:
    if times:
        return [message] * times
    else:
        return [message]


>>> repeat('안녕하세요', 3)
['안녕하세요', '안녕하세요', '안녕하세요']

타입 추상화

함수의 매개 변수에 대한 타입 어노테이션을 추가해줄 때는 타입을 추상적으로 명시해주는 것이 유리한 경우가 많다. 예를 들어 아래 toString() 함수는 nums 매개 변수의 타입을 List[int] 대신에 Iterable[int]로 명시해주고 있다.

def toString(nums: Iterable[int]) -> List[str]:
    return [str(x) for x in nums]

>>> toString([1, 2, 3])
['1', '2', '3']
>>> toString((1, 2, 3))
['1', '2', '3']
>>> toString({1, 2, 3})
['1', '2', '3']

이 함수를 통해 리스트, 튜플, 딕셔너리까지 처리할 수 있는 유연한 API를 가지게 되었음