About Python – ” 타입 힌트, Type Hint “
About Python – ” 타입 힌트, Type Hint “
동적 타이핑 언어인 Python
파이썬은 동적 타이핑 언어입니다. 그게 무슨 말인고, 하니…
a = 1
print("a의 타입 ", type(a))
a = "Hello"
print("a의 타입 ", type(a))
'''
a의 타입 <class 'int'>
a의 타입 <class 'str'>
'''
파이썬에서 위의 코드를 돌려 보면 파이썬 인터프리터는 아무런 오류를 내뿜지 않습니다. 아래의 C
코드가 컴파일 단계에서 에러를 내뿜는 것과는 확실히 다르죠?
#include <stdio.h>
int main()
{
int a = 1;
char a = "Hello";
return 0;
}
// error: conflicting types for ‘a’
이처럼 파이썬은 런타임 도중 타입이 변경될 수 있는 동적 타이핑 언어입니다.
def add(a, b):
return a+b
print(add(1, 3)) # 4
print(add("3", "hello")) # 3hello
그렇기에, 사용자가 원하지 않던 형태의 인자를 넘길 수도 있게 됩니다. add()
함수는 숫자를 연산하기 위해서 사용한 건데, 잘못하고 문자를 넣어 버리면 당장은 에러가 나지 않지만, 원하지 않던 형태의 값인 3hello
가 나와버리므로, 에러가 발생할 수 있습니다.
PEP 484
의 등장
https://peps.python.org/pep-0484/ 의 등장입니다. 타입을 지원할 수 있도록 하는 타입 힌트가 추가된 것이죠.
예컨대 위의 함수를 아래와 같은 형태로 타입을 선언할 수 있습니다.
def add(a:int, b:int) -> int:
return a+b
print(add(1, 3)) # 4
print(add("3", "hello")) # 3hello
“아, add()
는 정수형 a, b를 받아서 정수형을 리턴할 것이구나!” 를 함수의 형태를 보고 알 수 있게 되었죠? 위의 파이썬 문서에서도 “쉬운 정적 분석 및 리팩토링, 잠재적인 런타임 타입 검사, 유형 정보를 위한 파이썬 코드 생성” 을 목표로 한다고 되어 있습니다. 위의 형태로 타입을 명시하여 코드를 작성했지만, 에러는 나지 않습니다.
또 위의 문서를 읽어 보면 “성능 최적화를 위한 유형 힌트 사용은 독자의 연습 문제로 남겨두겠습니다.” 라는 문구가 보이네요. 이미 똑똑한 분들께서, mypy
와 같은 라이브러리를 설치하여 타입 검사를 사용할 수 있도록 개발해 두었습니다. 간단히 사용해 볼까요?
# pip install mypy
def add(a:int, b:int) -> int:
return a+b
print(add(1, 3)) # 4
print(add("3", "hello")) # 3hello
'''
(venv) goddessana@goddessanaui-MacBookAir study % mypy test.py
test.py:5: error: Argument 1 to "add" has incompatible type "str"; expected "int"
test.py:5: error: Argument 2 to "add" has incompatible type "str"; expected "int"
'''
mypy
처럼 이미 잘 만들어진 타입 검사 라이브러리들을 통해서 “정수형이 반환되어야 하는데, 문자열이 반환되었어!” 라는 타입 검사를 수행할 수 있습니다.