본문 바로가기

# Language/Python

[Python] 파이썬 Type Annotation / Type Hinting

파이썬 타입 어노테이션 / 타입 힌트

파이썬 변수 타입

원래 파이썬은 동적 프로그래밍 언어로, 코드를 실행하면 타입을 추론한다. C++, Java와 같이 변수의 타입을 별도로 설정해주지 않아도 된다. 또한 파이썬의 타입은 고정되어 있지 않아서 개발자가 자유롭게 바꿀 수 있다. 

>>> number = 1
>>> type(number)
<class 'int'>

>>> number = 1.0
>>> type(number)
<class 'float'>

>>> number = "1"
>>> type(number)
<class 'str'>

 

파이썬 타입 어노테이션(Type Annotation)은 타입에 대한 메타 정보를 제공하는 기능이다. 주석으로 사용되기 때문에 함수에 추가한 타입 어노테이션이 부정확한다고 해서 경고나 오류가 발생하지는 않는다.

 

 

사용하는 이유는?

코드 가독성 향상 

  • 어노테이션을 사용하면 변수, 함수 인자 및 반환 유형에 대한 정보를 제공하여 코드를 더 쉽게 이해할 수 있다.

 

협업 용이성

  • 여러 팀원이 참여하는 프로젝트에서 어노테이션은 변수, 함수 인자 및 반환 유형에 대한 정보를 공유하여 협업을 용이하게 할 수 있다.

 

타입 오류

  • 코드 작성 시에 타입 오류를 미리 방지하여 안정성을 높일 수 있다.
  • 디버깅 중 타입 관련 오류를 만나면, 어노테이션은 예상 유형에 대한 추가 정보를 제공한다.

 

유지 보수성 향상

  • 후속 개발자에게 추가 정보를 제공하여 코드의 유지 보수성을 향상시킬 수 있다.
  • 코드 리팩토링을 할 때 함수의 인자나 반환값의 타입이 변경되어도 타입 어노테이션을 통해 코드의 안정성을 유지할 수 있다.

 

사용 방법

변수

변수 이름 뒤에 콜론(:)을 붙이고 타입 명시한다.

name: str = "Silvia"
age: int = 30
emails: list: ["Silvia@gmail.com", "Silvia@work.com"]
address: dict = {
  "street": "A",
  "city": "B",
  "state": "SC",
  "zip": "24567"
}

 

함수

인자 타입과 반환 타입에 추가 할 수 있다. 인자에 타입 어노테이션을 추가할 때는 변수와 동일하게 적용하며, 반환값에 대한 타입을 추가할 때는 화살표(->)를 사용한다.

def score(num: int) -> str:
    return str(num)

def average(num1: int, num2: int, num3: int = 2) -> float:
    return ( num1 + num2 ) / num3

def greet(name: str) -> None:
    print ("Hi! " + str)

def repeat(message: str, times: int = 5) -> list:
    return [message] * times

 

Typing 모듈 

자료구조 내부 어노테이션을 추가할 때는 typing 모듈을 사용 할 수 있다.

List, Set, Dict, Tuple

from typing import List, Set, Dict, Tuple

nums: List[int] = [1]
unique_nums: Set[int] = {1, 2}
vision: Dict[str, float] = {'left': 1.0, 'right': 0.9}
Silvia: Tuple[int, str, List[float]] = (25, "Silvia", [1.0, 0.9])

 

 

Typing 모듈은 변수에 대한 여러가지 옵션 함수도 제공한다.

Union

여러개 타입이 허용될 수 있는 변수의 타입을 명시 할 때 사용한다.

def toString(num: Union[int, float]) -> str:
    return str(num)

 

Optional

None이 허용되는 함수의 매개 변수에 대한 타입을 명시 할 때 사용한다.

def repeat(message: str, times: Optional[int] = None) -> list:
    if times:
        return [message] * times
    else:
        return [message]

 

사용자 정의 타입( Class)

사용자 클래스에 대한 어노테이션도 추가 할 수 있다.

class User:
    ...

def find_user(id: str) -> User:
    ...

 

 

타입 어노테이션 확인

__annotations__ 사용하면 작성한 타입 어노테이션을 확인 할 수 있다.

>>> class Student:
...     name: str
...     age: int
...     score: dict
...
...     def set_name(name: str):
...             self.name = name
...
...     def get_name() -> str:
...             return self.name
...
>>> student = Student()
>>> student.__annotations__
{'name': <class 'str'>, 'age': <class 'int'>, 'score': <class 'dict'>}
>>> student.set_name.__annotations__
{'name': <class 'str'>}
>>> student.get_name.__annotations__
{'return': <class 'str'>}

 

<참고>

- https://docs.python.org/3/library/typing.html

- https://www.daleseo.com/python-type-annotations/