Python

[Python] 타입 어노테이션(type annotation)

비번변경 2024. 5. 8. 16:50

개요

Python은 변수의 타입을 명시하지 않는 대표적인 동적 타입 언어 중 하나인데, Python으로 개발된 프로젝트의 코드를 보면 함수 매개변수 등에 변수의 타입을 지정하는 것처럼 보이는 구문이 존재하는 것을 확인할 수 있다.

def greeting(name: str) -> str:
    return 'Hello ' + name

이 글에서는 해당 구문이 무엇을 의미하고, 어떻게 동작하는지 정리해두려고 한다.

 

 

타입 어노테이션(type annotation)

동적 타입 언어는 효율적으로 코드를 작성할 수 있어 일회성 스크립트나 작은 애플리케이션을 빨리 개발하기 좋다. 하지만 변수의 데이터 타입에 대한 동적인 면은 애플리케이션의 규모가 커질수록 프로그램의 안정성을 위협하기도 한다. 때문에 중규모 이상의 프로젝트에서는 타입 어노테이션을 이용해 타입 힌팅(type hinting)이라는 개발 프로세스를 도입하곤 한다.

 

타입 힌팅이란 코드 작성 시 타입에 대한 메타정보를 제공하는 것을 의미한다. Python에 타입 어노테이션이 추가되기 전에는 주석에 관련 정보를 추가해야 했으나 별다른 표준이 없어 일반 주석과 구분하기가 어려웠다.

num = 1  # type: int

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

 

그러나 타입 어노테이션은 타입 힌팅을 표준화한다.

num: int = 1

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

따라서 통합 개발 환경이나 린터에서 해석할 수 있도록 고안되었고, 코드 자동 완성이나 정적 타입 체킹에서 활용되고 있다.

다만 타입 어노테이션은 단순히 작성한 코드를 개발자가 읽기 쉽게 해 줄 뿐, 제약사항이 추가되는 것은 아니다. 즉, 타입 어노테이션이 추가되는 것으로 인해 컴파일 과정에서 오류가 발생하거나, 부정확한 타입 어노테이션이 경고를 야기하진 않는다.

 

 

기본 문법 - 변수

기본적으로 변수에 타입 어노테이션을 추가할 때는 변수명 뒤에 콜론을 붙이고 타입을 명시한다. 관례적으로 변수명 뒤 콜론에는 공백이 없고, 공백과 타입 사이에 공백을 준다.

name: str = "John Doe"

# 파이썬 3.8 이하
emails: list = ["john1@doe.com", "john2@doe.com"]

# 파이썬 3.9 이상
emails: list[str] = ["john1@doe.com", "john2@doe.com"]

# 파이썬 3.8 이하
address: dict = {
  "street": "54560 Daugherty Brooks Suite 581",
  "city": "Stokesmouth",
  "state": "NM",
  "zip": "80556"
}

# 파이썬 3.9 이상
address: dict[str, str] = {
  "street": "54560 Daugherty Brooks Suite 581",
  "city": "Stokesmouth",
  "state": "NM",
  "zip": "80556"
}

 

 

기본 문법 - 함수

 

함수에 대해서는 매개변수와 반환값에 대한 타입을 지정할 수 있다. 매개변수는 단순 변수 타입 어노테이션과 동일한 방식을 'var_name : class' 형식으로 지정한다. 그리고 반환값에 대한 타입은 화살표(->)를 사용한다.

def func_name(var_1: type, var_2: type = default_value) -> type:
    ...

 

예시 )

def plus(num1: int, num2: float = 3.5) -> float:
    return num1 + num2

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

# 파이썬 3.8 이하
def repeat(message: str, times: int = 2) -> list:
    return [message] * times

# 파이썬 3.9 이상
def repeat(message: str, times: int = 2) -> list[str]:
    return [message] * times

 

 

참고 문서

https://docs.python.org/ko/3.10/library/typing.html

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