home

Python generic

Generic[T]

from typing import TypeVar

T = TypeVar('T')
  • TypeVar는 타입 변수를 생성, 실제 타입을 나중에 지정할 수 있는 플레이스 홀더 역할
  • T는 관례적인 이름
  • 함수나 클래스가 여러 타입에 대해 동작할 수 있게 만들 때 사용
  • 입력 타입과 출력 타입 사이의 관계를 표현 가능
from typing import TypeVar, List

T = TypeVar('T')

def first(l: List[T]) -> T:
    return l[0]
int_result = first([1, 2, 3])
str_result = first(["a", "b", "c"])
  • 제네릭을 통해서 파이썬에서도 타입 안정성을 가져갈 수 있다.
from typing import TypeVar, Union

Number = TypeVar('Number', int, float)
  • 이렇게 int, float 등 TypeVar을 생성할 때 제약조건을 추가할 수 있다.

클래스에서의 Generic

  • Generic클래스가 하나 이상의 타입 변수를 사용하는 제네릭 클래스임을 나타낸다.
  • 이를 통해 클래스 내부에서 타입 변수를 사용 가능하게 함
from typing import TypeVar, Generic

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, content: T):
        self.content = content

    def get_content(self) -> T:
        return self.content

int_box = Box[int](5)
str_box = Box[str]("Hello")

print(int_box.get_content())  # 5
print(str_box.get_content())  # Hello

# 타입 체크도 가능하다
reveal_type(int_box.get_content())  # Revealed type is "int"
reveal_type(str_box.get_content())