Python/Utils

[Python Utils] Python Type 어노테이션/힌트 (Typing, mypy)

yubi5050 2022. 8. 24. 16:37

Python Type 어노테이션/힌트가 필요한 이유는?

Python은 동적 타입 언어(Dynamic language)로 실행하는 시점에 변수의 타입(Type)을 고려하며 체크하기 때문에 타입 힌팅을 통해 좀 더 방어적인 코드를 작성 할 수 있다.

mypy

mypy는 정적 타입의 검사기로 실행시 함수에 정상적으로 Type이 맞게 들어오는지 검사 해주는 역할을 한다.

# 라이브러리 설치
pip install mypy

# 실행 명령어
mypy test.py


# test.py
def add(a: int, b: int) -> int:  # int형 변수 a와 b를 입력받아서 int형 값을 반환
    return a + b

if __name__ == "__main__":
    add(1, 2) # 성공
    add('h', 3) # error 발생

 

 

Typing

  • 파이썬 코드의 명시적인 코드 작성을 위해 함수 인자의 Type, Return Type등을 정의 해주는 것
# 라이브러리 설치
pip install typing


# 예제 코드
from typing import Dict, List, Tuple
from typing import Sequence, TypeVar, Any
from typing import Union

def typing_basic():
    typing_list: List[str] = ["a1", "b1", "c1"]
    typing_tuple : Tuple[int, int] = (10, 20)
    typing_dict : Dict[str, bool] = {'a':True, 'b':False}
    print(typing_list, typing_tuple, typing_dict, )

def typing_basic2(a:float, b:float) -> float:
    typing_a, typing_b = a, b
    return typing_a + typing_b

T = TypeVar('T')
def typing_basic3(val: Sequence[T])->T:
    return val[0]

# Any : 어느것이 와도 괜찮음
def typing_basic4(val: Any)-> Any:
    return val

# Union : Any보다 조금 더 구체적으로 정함
def typing_basic5(val : Union[int,float]):
    return val

if __name__ == "__main__":
    typing_basic()
    print(typing_basic2(3.14, 2.5))
    print(typing_basic3([77,2,3]))
    print(typing_basic4('hh'), type(typing_basic4('hh')))
    print(typing_basic5(3))