Python

Python 타입 어노테이션 Part2

programmer-ds 2023. 1. 1. 01:05

2022.12.31 - [Programming/python] - Python 타입 어노테이션

이전 글에서 Python 타입 어노테이션에 대해 기본 내용을 소개하였다.

이번 글에서는 typing 모듈을 사용한 타입 어노테이션 내용에 대해 알아볼 것이다.

 

typing 모듈

Python의 typing 모듈은 standard 라이브러리에 있다. (Python Version >= 3.5)

 

Python의 기본 타입 어노테이션 문법을 통해서 int, str, list, 사용자 정의 class 등 다양한 타입을 지원한다.

하지만 기본적인 타입 힌트만 지원하고, Python의 내장 자료구조인 list, tuple, set 등과 같은 자료구조 내의 Type 지정 혹은 여러 개의 타입이 허용될 수 있는 타입의 지정,.. 등은 어렵다.

 

이러한 문제점을 해결해 줄 수 있는 것이 typing 모듈이다.

 

 

 

typing 모듈 List, Set, Dict

아래 typing 모듈의 예제를 살펴보자.

 

from typing import List, Set, Dict

num_list: List[int] = [1, 2, 3]

num_set: Set[int] = {1, 2, 3} 

num_dict: Dict[int, str] = {1: 'a', 2: 'b', 3: 'c'}

 

typing 모듈의 기본 예시이다. 

list와 set 내 타입을 특정 타입으로 지정하는 것이며, dictionary는 Key의 타입과 Value의 타입을 같이 입력하여 지정한다.

 

 

아래와 같이 typing 모듈로 list 내 타입을 int형으로 지정하였지만, list 값 추가 시에 str을 추가하여도 역시 실행은 된다. 하지만 아래와 같이 IDE에서 경고를 주는 것을 확인할 수 있다.

 

 

 

 

typing 모듈 Final

C, C++, Java 등의 언어에서는 const 혹은 final이라는 키워드로 변수를 상수화 시킬 수 있는 문법이 있다.

그렇게 할당된 변수는 재할당이 불가한 변수가 된다.

 

Python에서는 이러한 문법을 제공하지 않고있으며, 아래와 같이 typing 모듈의 Final을 이용하여 비슷하게 흉내낼 수 있다.

 

from typing import Final

CUSTOM_ERROR: Final[int] = 1
CUSTOM_ERROR = 2
print(CUSTOM_ERROR)
# 2

 

물론 해당 코드도 정상적으로 실행은 된다. 하지만 아래와 같이 IDE에서 재할당에 대해 경고를 주는 것을 확인할 수 있다.

 

 

 

 

typing 모듈 Union

typing 모듈은 여러 개의 타입을 허용하는 Union을 제공한다. 아래와 같이 int형 혹은 float형을 받도록 코드를 구현할 수 있다.

 

from typing import Union


def add(num1: Union[int, float], num2: Union[int, float]) -> Union[int, float]:
    return num1 + num2


print(type(add(10, 20)))
# <class 'int'>

print(type(add(10, 20.1)))
# <class 'float'>

 

 

typing 모듈 Optional

typing모듈의 Optional은 None이 허용되는 함수의 매개 변수에 대한 타입을 지정할 때 사용하게된다.

 

def square(num: Optional[int] = None) -> int:
    if num == None:
        return 0
    else:
        return num * num

print(square(None))
# 0

print(square(10))
# 100

 

 

여기까지 타입 어노테이션에 대한 내용을 확인하였습니다.

주의할 내용은 타입 어노테이션을 사용해도 언어가 작동하는 데에는 아무런 변화가 없다.

단순히 IDE를 통해 타입 불일치, 자동완성 등 부가적인 기능만 제공할 뿐이다.

실제로 정적 타입 효력을 갖는 기능을 사용하려면 Mypy와 같은 다른 라이브러리를 활용해야 한다.