조금씩 꾸준히 완성을 향해

[Python] Type hint & Type check 기본개념(타입 힌트, 타입 체크) 본문

Python/문법

[Python] Type hint & Type check 기본개념(타입 힌트, 타입 체크)

all_sound 2022. 9. 29. 00:13

Type Hint


Python은 동적 언어이기 때문에 변수들의 타입을 마음대로 변경가능하다.

이는 파이썬의 장점으로 꼽히기도 하지만, 프로그램의 규모가 커지고 코드가 많아지게 되면 이 유연함이 도리어 단점이 되기도 한다. 특히 여러 사람이 같은 코드를 가지고 작업하거나 수정할 때에는 더 큰 혼선이 야기된다. 이를 방지하기 위해서는 공유하는 데이터의 타입을 정확히 지정해 줄 필요가 있다.

이 때 사용하는 게 바로 type hint이다. 

 

 ※ 주의! 타입 힌트는 말그대로 힌트를 붙여놓은 것일 뿐, 타입 에러를 체크해 주는 기능은 아니다! 

 

타입 힌트는 기본적으로 아래와 같이 변수 옆에 콜론으로 표시한다. 

int_var: int = 88 #정수형
str_var: str = "hello world" #문자형
float_var: float = 88.9 #실수형
bool_var: bool = True #boolean

 

여러개의 값을 담는 집합형 데이터 타입의 경우에는 따로 모듈을 불러와서 사용해야 한다.

from typing import List, Tuple, Dict  #type hint 모듈

list_var: List[str] = ["1", "2", "3"]
tuple_var: Tuple[int, ...] = (1, 3, 4)
dic_var: Dict[str, int] = {"hello": 77}

이렇게 안에 들어갈 값들의 데이터 타입도 같이 지정해 주는 게 좋다. 

 

 

함수의 인자 타입을 지정할 경우에도 이렇게 콜론으로 표시하면 된다. 

def cal_add(x: int, y: int) -> int:
    return x + y

 

그러나 앞서 언급했듯이 타입이 지켜지지 않더라도 출력은 아주 잘된다.

print(cal_add(1, 3))  # 4

print(cal_add("1, ", "3, dsjkakljas"))  # 1, 3, dsjkakljas
 
print(cal_add([1, 3], [4, 5]))  # [1, 3, 4, 5]

원하던 인자는 정수였지만, 다른 타입이 들어오는 걸 막을 수는 없다. 

 

 

이를 해결하기 위해서는 Type을 checking 해주는 기능을 따로 만들어 사용할 수 있다. 

 

 

Type checking


isinstance(obj, class) 

# isinstance(obj, class)

print(isinstance("ashdjkasd", str))  #True
print(isinstance(88.9, float))  #True

object의 class를 확인해 주는 isinstance 메소드를 사용해 새로운 함수를 정의할 수 있다. 

 

def type_check(obj, typer) -> None:
    if isinstance(obj, typer):
        pass
    else:
        raise TypeError(f"Type Error : {typer}")

type checking을 수행하는 함수이며, 리턴값은 따로 없고 타입이 맞지 않을 경우 에러를 내뱉는 열할을 한다.

 

def cal_add(x: int, y: int) -> int:
    # code
    type_check(x, int)
    type_check(y, int)
    return x + y

기존 함수 안에 type_check 함수를 넣어 이런식으로 인자의 타입을 checking 해주면 실수 없이 정확한 코드를 짤 수 있다.

 

 

사실 더 쉽게 타입을 체킹하는 파이썬의 모듈이 존재한다. 그건 다음 번에!!