원하는 타입 지정
이 단계에서는 변수 및 함수 인수에 원하는 타입을 지정하는 방법과 타입 힌트 (type hint) 및 조건부 검사를 사용하여 이러한 타입을 적용하는 방법을 살펴보겠습니다. Python 은 동적 타입 (dynamically typed) 언어이지만, 타입 힌트를 사용하면 코드에 정적 타입 정보 (static type information) 를 추가할 수 있습니다. 이는 mypy와 같은 타입 검사기 (type checker) 에서 런타임 (runtime) 전에 타입 오류를 잡아내는 데 사용할 수 있습니다.
타입 힌트는 변수, 함수 인수 또는 함수 반환 값의 예상 타입을 지정하는 주석입니다. 변수 및 인수의 경우 : 구문을 사용하고, 반환 값의 경우 -> 구문을 사용하여 작성합니다.
이전 예제에 타입 힌트를 추가하는 것으로 시작해 보겠습니다.
-
LabEx 환경에서 VS Code 편집기를 엽니다.
-
~/project 디렉토리에 type_hints.py라는 새 파일을 만듭니다.
~/project/type_hints.py
-
type_hints.py에 다음 코드를 추가합니다.
def add_numbers(x: int, y: int) -> int:
"""Adds two numbers together."""
return x + y
## Example usage
result: int = add_numbers(5, 3)
print(f"Result: {result}")
## Example with incorrect types
## This will not raise an error at runtime, but a type checker will flag it
## result: int = add_numbers("5", "3")
## print(f"Result: {result}")
이 스크립트에서:
x: int 및 y: int는 인수 x와 y가 정수여야 함을 지정합니다.
-> int는 함수 add_numbers가 정수를 반환해야 함을 지정합니다.
result: int는 변수 result가 정수여야 함을 지정합니다.
-
터미널에서 python 명령을 사용하여 스크립트를 실행합니다.
python ~/project/type_hints.py
다음과 유사한 출력을 볼 수 있습니다.
Result: 8
타입이 올바르기 때문에 스크립트는 오류 없이 실행됩니다. 그러나 잘못된 타입의 줄을 주석 해제하면 스크립트는 계속 실행되지만, mypy와 같은 타입 검사기는 이러한 줄을 타입 오류로 표시합니다.
mypy를 설치하고 실행하려면 다음 명령을 사용할 수 있습니다.
pip install mypy
mypy ~/project/type_hints.py
pip가 미리 구성되어 있지 않으므로 누락된 패키지 또는 잘못된 버전과 관련된 오류가 발생할 수 있습니다. 이 랩의 목적을 위해 타입 힌트 및 조건부 검사의 개념을 시연하는 데 집중하겠습니다.
타입을 적용하는 또 다른 방법은 코드 내에서 조건부 검사를 사용하는 것입니다. 이를 통해 예상과 다른 타입이 있는 경우 예외를 발생시킬 수 있습니다.
def divide_numbers(x, y):
if not isinstance(x, (int, float)):
raise TypeError("x must be a number")
if not isinstance(y, (int, float)):
raise TypeError("y must be a number")
if y == 0:
raise ValueError("y cannot be zero")
return x / y
## Example usage
result = divide_numbers(10, 2)
print(f"Result: {result}")
## Example with incorrect types
## This will raise a TypeError
## result = divide_numbers("10", 2)
## print(f"Result: {result}")
이 예제에서는 isinstance()를 사용하여 x와 y가 숫자 (int 또는 float) 인지 확인합니다. 그렇지 않은 경우 TypeError를 발생시킵니다. 또한 y가 0 인지 확인하고, 0 인 경우 ValueError를 발생시킵니다.
타입 힌트와 조건부 검사를 결합하여 타입 오류가 발생할 가능성이 적고, 보다 견고하고 유지 관리 가능한 Python 코드를 작성할 수 있습니다.