5. 타입 힌트와 코드 테스트
파이썬은 변수에 “나는 평생 정수(int)만 받을 거야!” 하고 못 박지 않는 동적인 언어입니다. 아주 편하지만, 가끔 다른 사람이 문자열을 집어넣어 프로그램이 와장창 깨지는 사고가 나기도 하죠. 이런 실수를 막기 위해, 코드를 실행하기 전 에디터 화면에 “이 변수는 이런 타입만 넣어줘”라고 팻말을 달아주는 기능이 바로 타입 힌트(Type Hint)입니다.
5.1 코드에 달아주는 명찰 (Type Annotation)
파이썬 3.6부터 변수 뒤에 콜론(:)을 붙이고, 함수 화살표(->)를 사용하여 의도하는 데이터의 종류(타입)를 메모해둘 수 있습니다.
# a와 b는 정수(int)를 받고, 결과 결과도 정수(int)가 나온다고 메모!
def add_numbers(a: int, b: int) -> int:
return a + b
# 문자열을 넣어도 프로그램이 당장 멈추지는 않지만...
# 똑똑한 백신(에디터의 타입 체커)이 빨간 줄을 그어 경고해줍니다!
print(add_numbers("Hello", "World"))
주의사항: 타입 힌트는 어디까지나 ‘힌트(주석)’일 뿐이라, 실제 파이썬 엔진은 이를 쿨하게 무시하고 코드를 강제로 실행시킵니다. 따라서 코드 규칙 방어용으로 코딩 단계에서 사용합니다.
5.2 typing 모듈로 더 정교한 힌트 만들기
조금 더 디테일한 힌트를 주기 위해 파이썬은 typing이라는 별개의 모듈을 제공합니다.
예를 들어 그냥 리스트가 아니라 “정수만 들어있는 리스트”라고 확실히 못 박고 싶을 때 사용합니다.
from typing import List, Dict
# 이 리스트 안에는 문자열(str)만 들어와야 합니다!
names: List[str] = ["Alice", "Bob"]
# 딕셔너리의 키는 문자열(str), 값은 정수(int)만 와야 합니다!
scores: Dict[str, int] = {"Alice": 100, "Bob": 80}
나만의 타입 만들기 (TypeVar, Generic)
어떤 함수는 “문자열과 바이트 둘 다 받을 수 있는데, 들어온 녀석의 타입을 그대로 돌려주고 싶어!” 할 때가 있습니다. 이때는 TypeVar (타입 변수)를 만들어서 사용합니다.
from typing import TypeVar
# T는 딱 str이나 bytes 둘 중 하나만 된다고 규칙을 만듭니다.
T = TypeVar('T', str, bytes)
def concat(x: T, y: T) -> T:
return x + y
5.3 이 설명서가 참인지 확인해줘! (doctest)
함수를 만들 때, 함수 바로 아래 큰 따옴표 3개 """ 로 묶어서 “이 함수는 이렇게 쓰는 거야~” 하고 작성한 설명서를 독스트링(Docstring)이라고 부릅니다.
여기에 덤으로 Python 대화형 창(>>>)에서 실행하는 예제 코드를 함께 적어두면, 파이썬이 이 주석을 눈으로 읽고 “음, 설명서에 적힌 코드의 결과가 실제 결과랑 똑같이 나오는지 내가 검사해줄게!”라고 알아서 테스트해주는 마법 기능이 doctest입니다.
def my_func(a, b):
"""
이 함수는 두 숫자를 더합니다.
>>> my_func(2, 3)
5
>>> my_func(10, 10)
20
"""
return a + b
이렇게 적어두고 터미널에서 python -m doctest 파일명.py 시스템 명령을 내리면, 만약 내 코드의 덧셈 로직이 틀렸을 경우 주석에 쓴 결과(5, 20)와 다르다며 삑- 하고 에러를 뿜어주어 아주 편리하게 디버깅이 가능합니다.