python / / 2024. 8. 21. 19:38

[python] mypy는 무엇인가?

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

위 코드에서 mypyab가 정수형이어야 하며, 반환값도 정수형이어야 함을 보장한다.

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는 해당 타입에 의존하는 다른 코드 부분에서 발생할 수 있는 오류를 미리 알려준다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유