본문 바로가기
기타/파이썬

[잡담] 파이썬의 타입 힌트와 typing, mypy를 알아보자!

by 수완동날다람쥐 2021. 3. 21.

0. Intro

파이썬은 동적 타이핑 언어이다. 다시 말해, 하나의 변수가 타입에 구애받지 않는 데이터를 표시할 수 있다는 것이다. 그래서 동적 타이핑은 쉽고 간결한 코드를 만들 수 있다.

하지만 동적 타이핑 방식의 경우, 변수에 전달되는 값이 개발자가 원하는 것으로 전달되는지를 감시할 수 없다는 단점이 있다. 예컨대 특정 함수를 호출할 때, 특정 매개변수에는 Int가 전달되고, 다른 매개변수에는 str이 전달되어야 한다고 가정하자. 이것이 잘 되었는지, 잘못 되었는지는 실제 실행시키기 전까지는 파악하기 힘들다. 따라서 타입이 맞지 않아 발생하는 런타임 에러를 미연에 파악할 수 있도록 정적 타이핑 방식이 이용되는 것이다.

물론 코드가 불가피하게 길어진다거나 하는 단점이 존재하지만, 전달되는 값의 타입을 제어할 수 있다는 장점 때문에 정적 타이핑 방식이 사용된다.

파이썬의 타입에 대한 유연함은 일회성 스크립트 작성 시에 굉장히 유용하다. 하지만, 스크립트의 규모가 커질수록 이러한 유연함이 오히려 독으로 작용할 수 있다. 프로젝트의 규모가 커질수록 전달되는 값을 제어하는 것의 중요도는 높아진다고 할 수 있겠다.

1. 타입 어노테이션, 타입 힌트

예전에 변수의 타입을 표시하려면 주석을 이용해야 했다. 코드를 읽는 개발자에게 약간의 도움이 될 수는 있었으나, 정해진 표준이 없었고, 일반 주석과도 구별하기 어려웠다.

def square(x):
	# type: int -> int
	return x * x

타입 힌팅에서는 타입 어노테이션이라는 새로운 방법으로 파이썬 코드의 타입 표시를 표준화한다. IDE나 linter에서도 해석할 수 있으며, 코드 자동 완성이나 정적 타입 체킹에서 활용되고 있다.

def square(x: int) -> int:
	return x * x

 

 

2. typing

파이썬 3.5 버전부터 기본 내장 라이브러리로 탑재된 typing이라는 모듈을 통해 조금 더 복잡한 타입 어노테이션을 구현할 수 있다.

# list, dict, tuple, set의 자료형을 지정
from typing import List, Dict, Tuple, Set

nums: List[int] = [1, 2, 3]
countries: Dict[str, int] = {"A": 1, "B": 2, "C": 3}
user: Tuple[int, str, bool] = (1, "1", True)
chars: Set[str] = {"A", "B", "C"}
# Final: 상수
from typing import Final

number: Final[int] = 10
# Union: 여러 타입이 허용되는 경우
from typing import Union

def toString(num: Union[int, float]) -> str:
    return str(num)
# Optional: None이 허용되는 경우
from typing import Optional

def repeat(message: str, times: Optional[int] = None) -> list:
    if times:
        return [message] * times
    else:
        return [message]
# 스크립트를 짜다보면, 타입을 추상적으로 지정해주는 것이 유리할 때가 많다
from typing import Iterable, List

def toStrings(nums: Iterable[int]) -> List[str]:
# list뿐만 아니라, dict, tuple, set 까지도 인수를 받을 수 있게 되었다.
    return [str(x) for x in nums]

한 가지 주의할 점은, 타입 어노테이션을 추가한다고 해서, 언어 차원에서 어떤 효력이 발생하는 것은 아니라는 점이다. 실제로 어노테이션에 반하는 값을 사용하더라도 경고 내지 에러 메시지를 출력하지는 않는다.

실행이 잘 된다.. 뭐하러 자료형을 명시해주었나..

따라서 타입 어노테이션을 추가한 코드를 검증하기 위해서는 Mypy라는 정적 타입 검사기를 사용해야 한다.

 

2. mypy

mypy는 파이썬에서 가장 많이 사용되고 있는 정적 타입 검사 도구이다. 타입 어노테이션이 추가된 스크립트를 mypy로 실행시키면 타입체크를 수행한다.사용법은 간단하다. 그냥 실행만 시켜주면 된다.

from typing import List

numbers: List[int] = [1,2,3]
% mypy typing_test.py 
Success: no issues found in 1 source file

위 코드 스크립드를 mypy로 실행시킨 결과이다. 아무 문제가 없다고 출력된 것을 볼 수 있다.

고의로 문제를 발생시켜본다.

from typing import List

numbers: List[int] = [1,2,"3"]
% mypy typing_test.py
typing_test.py:3: error: List item 2 has incompatible type "str"; expected "int"
Found 1 error in 1 file (checked 1 source file)

리스트의 2번 인덱스 아이템이 이상하다. int가 들어와야 하는데 str이 들어왔다고 출력해주는 것을 볼 수 있다.

댓글