Annotated

1. 개념

  • 타입 힌트에 추가 메타데이터를 붙이는 표준 방식
  • 실제 타입은 유지하면서 특정 프레임워크나 검사기가 참고할 만한 정보를 담을 때 사용한다.

2. 문법

1
2
3
4
5
from typing import Annotated

x: Annotated[int, "0보다 큰 값"]
# 첫 번째가 타입
# 뒤의 값들은 메타데이터
  • 실제 타입은 int형
  • “0보다 큰 값”이라는 것은 부가 정보(메타데이터)
  • 일반적인 파이썬 실행 자체(=런타임)에서는 메타데이터를 자동으로 검증하거나 강제하지 않는다.
  • 대신, FastAPI나 Pydantic, LangGraph와 같은 프레임워크나 도구에서 이 메타데이터를 읽어 활용한다.

3. 활용

(1) 타입 힌트에 메타데이터 추가

  • 변수(또는 인스턴스)의 타입, 그리고 값에 대한 설명을 추가할 때 사용한다.
1
2
3
4
from typing import Annotated

def greet(name: Annotated[str, "사용자 이름"]) -> str:
    return f"Hello, {name}"

(2) 검증 규칙

  • 변수의 값에 대한 검증 규칙을 정의할 때 사용
1
2
3
4
5
from typing import Annotated
from pydantic import BaseModel, Field

class User(BaseModel):
    age: Annotated[int, Field(gt=0, lt=150)]
1
2
3
4
5
6
7
u = User(age=160)

# Error >> 
# ValidationError: 1 validation error for User
# age
#   Input should be less than 150 [type=less_than, input_value=160, input_type=int]
#     For further information visit https://errors.pydantic.dev/2.11/v/less_than
  • 다만 파이썬 자체에서 검증 규칙을 검증하는 게 아니라, Pydantic이나 기타 프레임워크 차원에서 검증한다.

(3) 의존성 주입

1
2
3
4
5
6
7
8
from typing import Annotated
from fastapi import Depends

def get_db():
    ...

def read_users(db: Annotated[object, Depends(get_db)]):
    ...

4. Annotated 를 사용하는 이유

  • 특정 필드에 대한 정보를 더 명확하게 해줄 수 있다.
  • 메타데이터를 붙이는 표준화된 방식
  • 정적 타입 검사와 런타임 프레임워크 사용을 분리해서 표현할 수 있다. 즉, 타입 검사기는 타입(Annotated의 첫 번째 인자)만 보고, 프레임워크 레벨에서는 그 뒤의 메타데이터들을 본다는 말.

Reference

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

Comments