문제의 역사
함수 주석은 파이썬 3.0에서 등장했으며, 타입 힌트 메커니즘은 PEP 484에 설명되어 있으며, 3.5에서 추가되었습니다. 이 도구는 코드의 정적 분석, 자동 완성 및 가독성 향상을 위해 만들어졌습니다. 타입 라이브러리(typing)는 변수, 인수 및 함수 반환 값의 예상 타입을 명시적으로 지정할 수 있게 해줍니다.
문제
파이썬은 동적 언어로, 변수의 타입은 실행 중에 변경될 수 있으며, 이는 프로그램 실행 단계에서만 오류가 발생할 수 있습니다. 주석은 코드 실행에 영향을 미치지 않지만 잘못 사용될 경우 프로그래머에게는 "엄격한 타입화"에 대한 잘못된 인식을 줄 수 있습니다.
해결책
타입 주석은 문서화, mypy, pylance, pyright 등의 도구를 통한 자동 검사 및 IDE와의 통합을 위해 사용됩니다. 이는 인수 이름 뒤에 콜론과 매개변수 목록 뒤에 화살표로 구현됩니다:**
def greet(name: str, times: int = 1) -> None: for _ in range(times): print(f"Hello, {name}!") # 딕셔너리를 처리하기 위한 올바른 주석 from typing import Dict, List def transform(data: Dict[str, List[int]]) -> float: return sum(sum(lst) for lst in data.values()) / 10
주요 특징:
파이썬이 주석에 선언된 타입에 대해 "자동으로" 검사를 할 수 있을까요?
아니요! 타입 검사는 반드시 mypy와 같은 정적 분석 도구를 통해서만 발생합니다. 런타임에서 파이썬은 주석의 내용을 완전히 무시합니다.
def f(x: int): return x * 2 print(f('oops')) # 타입 str, 오류가 발생하지 않습니다!
주석은 어디에 저장되며 런타임에 어떻게 접근할 수 있을까요, 왜 필요한가요?
특별한 속성 __annotations__에 저장됩니다:
def add(x: int, y: int) -> int: return x + y print(add.__annotations__) # {'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
타입 검증, 문서 자동 생성, 직렬화 등을 위해 타사 라이브러리에서 사용됩니다.
모든 변수를 주석 처리할 수 있나요, 오직 함수만, 글로벌 영역에서는 어떻게 되나요?
로컬 및 글로벌 변수 모두 콜론으로 주석 처리가 가능하며, 이는 실행에 영향을 미치지 않습니다:
index: int = 0 def func(x: 'User') -> None: ...
기업 프로젝트에서 모든 개발자들이 주석을 활발히 도입하게 되었으나, 함수 인수의 실제 타입이 종종 지정된 것과 일치하지 않았습니다. 파이썬은 이러한 오류를 무시했으며, 예상치 못한 버그들은 비즈니스 로직 깊숙한 곳에서만 발생했습니다. mypy 설정이 없었습니다.
장점:
단점:
타입 힌트를 사용하고 CI에서 mypy를 필수적으로 실행하며, __annotations__에 따라 문서를 자동 생성:
장점:
단점: