Mypy - 파이썬에서 타입 체크하기

SeHun.J·2023년 12월 6일
0

동적 프로그래밍 언어

파이썬은 동적(dynamic) 프로그래밍 언어로 하나의 변수가 여러가지의 타입을 가질 수 있습니다. 파이썬의 동적 타입 처리는 일회성 스크립트나 소규모의 애플리케이션을 빠르게 개발할 때는 큰 장점으로 작용합니다. 하지만, 그 규모가 커질수록 유연함이 치명적인 버그로 이어질 확률이 높습니다.

타입 어노테이션(type annotation)은 파이썬 코드에 타입을 명시하기 위한 표준을 정립하기 위해서 파이썬 3.5에 추가되었습니다. 이 표준에 따라 변수나 함수에 타입이 명시된 파이썬 코드는 정적 타입 검사기(static type checker)를 통해 코드를 실행하지 않고도 타입 에러를 찾아낼 수 있습니다.

Mypy 설치 및 실행

Mypy는 파이썬에서 가장 많이 사용되고 있는 정적 타입 검사 도구입니다. 타입 어노테이션이 추가된 파이썬 코드를 상대로 Mypy를 돌리면 타입 에러를 찾아내줍니다.

Mypy는 pip으로 손쉽게 설치할 수 있습니다.

pip install mypy

Mypy를 터미널에서 실행할 때는 파일을 인자로 넘기면 됩니다.

mypy exec_file.py

타입 검사

실습을 위해 다음과 같이 매우 간단한 파이썬 코드를 작성해보겠습니다. test 변수의 타입을 int로 명시하기 위해서 타입 어노테이션을 추가하였습니다.

test: int = "1"
print(test)

이 코드를 파이썬 인터프리터로 실행해보면 다음과 같이 문제없이 잘 돌아갑니다(?)

python main.py
1

그 이유는 타입 어노테이션은 인터프리터 실행 단계에서는 아무런 영향을 주지 않기 때문입니다. 이렇게 타입 어노테이션을 사용하는 것을 타입 힌트(type hinting)라고 하는데 주로 코드를 읽기 쉽게 하거나, 코드 편집기(IDE)나 린터(linter)에서 활용됩니다.

이 코드를 다시 Mypy로 돌려보면 변수의 타입과 변수에 저장된 값의 타입이 다르다고 타입 에러가 발생합니다.

mypy main.py
main.py:1: error: Incompatible types in assignment (expression has type "str", variable has type "int")
Found 1 error in 1 file (checked 1 source file)

이렇게 Mypy를 사용하면 파이썬 인터프리터가 잡지 못하는 타입 버그를 쉽게 찾아낼 수 있습니다.

int, float 등 기본적으로 있는 타입힌트도 있지만, 그 외에도 더 다양한 타입힌트를 사용하고 싶다면 typing 라이브러리를 import 하면 됩니다. (Final, Union, Optional, Callable...)

from typing import Union

def test(v:Union[int, float]) -> bool:
	if type(v) == int:
    	print(f"{v}는 int형 자료입니다.")
    elif type(v) == float:
    	print(f"{v}는 float형 자료입니다.")

test(1)
test(1.1)

오류 검사

Mypy는 타입 검사 뿐만 아니라 실제로 런타임에 발생할 수 있는 오류를 미리 알아낼 수도 있습니다.

Mypy 설정

Mypy를 실행할 때 커맨드에 옵션을 추가해서 실행할 수도 있지만, 협업을 하거나 매번 같은 옵션을 부여해야하는 경우에는 설정 파일을 이용할 수 있습니다.

설정 파일은 프로젝트 최상위 디렉토리의 mypy.ini 또는 .mypy.ini, setup.cfg를 사용하도록 되어 있습니다. 예를 들어, app과 test 디렉토리의 모든 파일을 타입 체크하되 일부 디렉토리를 제외하고 싶다면 다음과 같이 설정할 수 있습니다.

[mypy]
files = app,test
show_error_context = True
show_column_numbers = True
show_error_codes = True
pretty = True

[mypy-app.*.migrations.*]
ignore_errors = True

이와 같이 모듈 레벨에서 상세 설정이 가능하기 때문에 기존에 타입 에러가 있는 프로젝트에서 Mypy를 사용하는데 지장이 없습니다.

profile
취직 준비중인 개발자

0개의 댓글