파이썬 알고리즘 인터뷰 책을 읽다가 파이썬 타입 힌트에 대해서 알게 됐다.
최근에 파이썬으로 코딩테스트를 봤는데, 그 때 사용자 정의 함수를 만들 때 입력 변수의 타입과 출력 변수의 타입을 헷갈린 적이 있었다.
이부분을 해결하기 위해서 파이썬의 타입 힌트 기능을 쓰면 좋을 것 같아서 공부한 겸 정리해 보려고 한다.
파이썬은 대표적인 동적 타이핑 언어임에도 타입을 지정할 수 있는 타입 힌트가 PEP 484 문서에 추가됐다.
다음과 같이 타입을 선언할 수 있다.
a: str = "1"
b : int = 1
기존에는 사용자 정의 함수에서 타입 힌트를 사용하지 않아서 다음과 같이 썼는데
def fn(a):
...
fn( ) 함수의 파라미터 a에는 어떠한 타입의 값을 넘겨야 하는지 전혀 알 수 없으며 함수의 리턴 값 또한 알 수 없다.
나중에 프로젝트 규모가 커지면 가독성을 떨어뜨리게 되며 버그 유발의 주범이 된다. 따라서 다음과 같이 타입 힌트를 선언해보자.
def fn(a: int) -> bool:
...
이처럼 타입 힌트를 사용하게 되면 fn( ) 함수의 파라미터 a가 정수형임을 분명하게 알 수 있고, 리턴 값으로 True or False를 반환 하는 것 또한 확실하게 알 수 있다.
이와 같이 명시적으로 선언하게 되면 버그를 줄일 수 있고, 가독성 또한 좋아진다.
온라인 코딩 테스트 시 mypy를 사용하면 타입 힌트에 오류가 있는지 자동으로 확인 할 수 있다.
$pip install mypy
다음과 같이 mypy를 설치할 수 있다.
타입 힌트가 잘못 지정된 코드는 incompatible return value type 오류가 발생하므로 확인 후 직접 코드를 수정해 나갈 수 있다.
fn ( ) 함수의 예제를 구현해 보았다.
def fn(a:int, b:str)->str:
if str(a) == b:
return True
else:
return False
result = fn(1, '1')
print(result)
다음과 같이 현재 return 값이 boolean타입인데, 위에 타입 힌트에서 리턴 타입을 str로 설정해버리면 의도한 대로 진행되지 않는다. 따라서
python3 -m mypy test.py
를 실행하게 되면
test.py:3: error: Incompatible return value type (got "bool", expected "str") [return-value]
test.py:5: error: Incompatible return value type (got "bool", expected "str") [return-value]
와 같은 에러를 만나게 되고, str를 예상했지만 bool 타입을 return 받았다는 에러가 뜨게 된다.
따라서 다음과 같이 fn ( ) 함수를 고치면
def fn(a:int, b:str)->bool:
if str(a) == b:
return True
else:
return False
result = fn(1, '1')
print(result)
Success: no issues found in 1 source file
라는 말과 함께 검사를 종료하게 된다.
파이썬에도 이런 기능이 있었군요. 덕분에 배웠습니다!