PEP 484–Type Hints

Python에 타입 힌트(Type Hints)를 도입하여 함수의 인자와 반환값에 대한 타입을 명시할 수 있도록 하는 표준을 정의
Python 3.5부터 도입됨.
코드의 가독성을 높이고 정적 타입 분석 도구가 코드를 검사할 수 있도록 돕는다.
PEP 484는 Python의 동적 타이핑 특성을 유지하면서, 타입 힌트를 통해 코드의 품질과 유지보수성을 향상시키는 것을 목표로 한다.

주요 내용

함수 주석을 통한 타입 힌트

  • 함수 인자와 반환값에 대한 타입 정보를 제공하여 코드의 의도를 명확히 한다.
  • 예를 들어, 문자열을 인자로 받고 문자열을 반환하는 함수는 다음과 같이 정의할 수 있다.
1
2
3
4
def greeting(name: str) -> str:
	return 'Hello ' + name`
# `name: str`: `name` 인자는 문자열이어야 함을 나타냅니다.
# `-> str`: 함수가 문자열을 반환함을 나타냅니다.

정적 타입 검사

  • 타입 힌트는 런타임에 강제되지 않으며, 정적 분석 도구(예: mypy)를 사용하여 코드의 타입 일관성을 검사할 수 있다.
  • 이는 코드 작성 시 오류를 미리 발견하고 수정할 수 있게 도와준다.

타입 힌트 모듈

  • typing 모듈을 통해 다양한 타입 힌트를 제공한다. 예를 들어, 리스트, 딕셔너리와 같은 컨테이너 타입 및 제네릭(Generic) 타입을 지원한다.

유연한 사용

  • 타입 힌트는 선택 사항이며, Python은 여전히 동적 타이핑 언어로 남아 있다. 즉, 모든 함수에 타입 힌트를 추가할 필요는 없다.

예제

간단한 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 1. 기본적인 타입 힌트 사용
def greeting(name: str) -> str:
    # name 파라미터는 문자열(str) 타입이어야 함을 나타냄
    # -> str 은 함수가 문자열을 반환함을 나타냄
    return f"Hello, {name}!"

# 2. 여러 기본 타입들의 사용
def calculate_total(quantity: int, price: float) -> float:
    # quantity는 정수(int), price는 실수(float) 타입
    # 반환값은 실수(float) 타입
    return quantity * price

# 3. 리스트 타입 힌트 사용
from typing import List

def get_first_name(names: List[str]) -> str:
    # names는 문자열 리스트임을 나타냄
    # List[str]은 모든 요소가 문자열인 리스트를 의미
    return names[0] if names else ""

# 4. 옵셔널 타입 사용
from typing import Optional

def find_user(user_id: Optional[int]) -> Optional[str]:
    # user_id는 정수이거나 None일 수 있음을 나타냄
    # 반환값도 문자열이거나 None일 수 있음
    if user_id is None:
        return None
    return f"User_{user_id}"

복잡한 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from typing import Dict, Tuple, Union, Callable

# 5. 딕셔너리와 복합 타입
def process_user_data(
    user_info: Dict[str, Union[str, int]]
) -> Tuple[str, int]:
    # Dict[str, Union[str, int]]는 
    # - 키는 문자열이고
    # - 값은 문자열 또는 정수인 딕셔너리를 의미
    # Tuple[str, int]는 문자열과 정수로 구성된 튜플을 반환한다는 의미
    name = user_info.get("name", "")
    age = user_info.get("age", 0)
    return name, age

# 6. 함수 타입 힌트
def apply_operation(
    func: Callable[[int, int], int],
    x: int,
    y: int
) -> int:
    # Callable[[int, int], int]는
    # - 두 개의 정수를 입력받고
    # - 정수를 반환하는 함수를 의미
    return func(x, y)

# 7. 제네릭 타입
from typing import TypeVar, Sequence

T = TypeVar('T')  # 제네릭 타입 변수 정의

def first_element(sequence: Sequence[T]) -> Optional[T]:
    # Sequence[T]는 임의의 타입 T로 이루어진 시퀀스를 의미
    # Optional[T]는 T 타입 또는 None을 반환할 수 있음을 의미
    return sequence[0] if sequence else None

참고 및 출처