mypy
는 Python 코드에 대해 정적 타입 검사를 수행하는 도구이다. 정적 타입 검사는 프로그램이 실행되기 전에 코드의 타입 오류를 검출하는 방법이다. Python은 기본적으로 동적 타이핑 언어이기 때문에, 변수의 타입을 명시하지 않아도 동작한다. 그러나 타입 주석을 추가하고 mypy
를 사용하면, 컴파일 시간에 타입 오류를 미리 확인할 수 있어 코드의 신뢰성을 높일 수 있다.
타입을 지정하지 않고 함수를 만들어보자.
def add_numbers(a, b):
return a + b
여기에 a와 b를 넣어보자.
add_numbers("a", "b")
그러면 결과가 ab
로 출력이 된다.
이번엔 아래와 같이 실행해보자.
add_numbers(1, 2)
결과가 3
이 나온다. 이렇듯 실행시점에 타입을 체크하여 결과가 달라진다.
함수에 타입 주석을 추가하면 함수가 어떤 타입의 인자를 받아들이고, 어떤 타입의 값을 반환하는지 명확히 할 수 있다.
def add_numbers(a: int, b: int) -> int:
return a + b
위 코드에서 mypy
는 a
와 b
가 정수형이어야 하며, 반환값도 정수형이어야 함을 보장한다.
2. mypy
설치 방법
mypy
를 설치하는 방법은 매우 간단하다. pip
을 사용하여 다음 명령어를 실행하면 된다.
pip install mypy
설치가 완료되면, 명령줄에서 mypy
명령어를 사용하여 Python 파일을 검사할 수 있다.
3. mypy
기본 사용법
mypy
를 사용하여 Python 코드를 검사하는 방법은 간단하다. Python 파일을 작성한 후, 해당 파일을 mypy
로 검사하면 된다.
mypy your_script.py
예제
def greeting(name: str) -> str:
return "Hello, " + name
greeting(42)
위 코드에서 greeting
함수는 문자열을 인자로 받아 문자열을 반환해야 한다. 그러나 greeting(42)
는 정수를 인자로 전달하고 있으므로, mypy
는 이 코드에서 타입 오류를 검출한다.
$ mypy script.py
script.py:4: error: Argument 1 to "greeting" has incompatible type "int"; expected "str"
Found 1 error in 1 file (checked 1 source file)
이렇게 mypy
를 사용하면 코드에서 발생할 수 있는 타입 관련 오류를 사전에 방지할 수 있다.
4. mypy
의 주요 기능
mypy
는 기본적인 타입 검사를 넘어 다양한 기능을 제공합니다. 여기서는 몇 가지 주요 기능을 소개합니다.
4.1. 타입 주석(Type Hints)
mypy
는 Python의 타입 주석을 사용하여 코드의 타입을 검사한다. 기본적인 변수 타입 외에도, 함수의 인자와 반환값, 리스트나 딕셔너리와 같은 복합 자료형의 타입도 검사할 수 있다.
from typing import List, Dict
def process_items(items: List[int]) -> Dict[str, int]:
return {str(item): item for item in items}
4.2. Optional 타입
Python에서는 None
을 반환할 수 있는 경우가 많다. 이를 위해 Optional
타입을 사용할 수 있으며, mypy
는 이를 고려하여 타입 검사를 수행한다.
from typing import Optional
def find_item(items: List[int], target: int) -> Optional[int]:
if target in items:
return target
return None
4.3. 유니언(Union) 타입
하나 이상의 타입을 허용하는 변수를 정의할 때는 Union
을 사용할 수 있다. 이는 변수가 여러 타입을 가질 수 있는 상황을 명확하게 표현할 수 있다.
from typing import Union
def process_value(value: Union[int, str]) -> str:
if isinstance(value, int):
return str(value)
return value
4.4. 타입 추론(Type Inference)
mypy
는 명시적인 타입 주석이 없더라도, 변수의 타입을 추론할 수 있다. 하지만 복잡한 코드에서는 명시적인 타입 주석을 추가하여 타입 오류를 방지하는 것이 좋다.
5. mypy
의 실제 활용
실제 개발 환경에서 mypy
는 코드의 품질을 유지하고, 버그를 줄이는 데 중요한 역할을 할 수 있다. 특히, 대규모 프로젝트에서는 코드의 일관성과 안전성을 유지하는 것이 중요한데, mypy
는 이를 보장하는 데 큰 도움을 준다.
5.1. CI/CD 파이프라인에 통합
mypy
는 CI/CD 파이프라인에 통합되어 코드가 배포되기 전에 타입 검사를 자동으로 수행할 수 있다. 이를 통해 코드에 타입 오류가 없는지 자동으로 확인하고, 문제가 있는 경우 배포를 중단할 수 있다.
5.2. 리팩토링 시 유용성
코드를 리팩토링할 때, mypy
를 사용하면 타입 오류를 쉽게 발견할 수 있다. 특히, 변수나 함수의 타입이 변경되었을 때, mypy
는 해당 타입에 의존하는 다른 코드 부분에서 발생할 수 있는 오류를 미리 알려준다.