본문 바로가기

Python

[python documents] python3.11 pep 681(Data class transforms)

Why?

  • 영어 공부 및 지식 습득

summary

  • 몇몇 인기 있는 라이브러리에는 dataclasses와 유사하지만, standard type annotation을 사용해서 설명할 수는 없다.
  • 위에 해당하는 라이브러리는 attrs, pydantic, ORM 등을 말한다.

contents

motivation

  • dataclass와 비슷한 라이브러리가 type checker들에 자신의 동작을 선언할 수 있는 표준 방법이 없다.
  • 커스텀 라이브러리가 존재하나, 유지가 어렵고, 파이썬 개발자도 다운로드, 설정하고 사용해야한다.

rationale(이유)

  • dataclass와 비슷한 모든 라이브러리의 기능을 지원하는 것은 아니다.
  • 라이브러리들의 일반적인 기능을 정적 타입 체크와 호환되는 방식으로 사용할 수 있게 한다.
  • 라이브러리들이 지원하지만, dataclass에서 지원하지 않는 기능들은 향후에 추가 고려중이다.

specification

dataclass_transform은 데코레이터, 클래스, 메타클래스로 사용 가능하다. dataclass_transform은 정적 타입 체커한테 런타임 "magic"을 수행하여 클래스를 변환하고, dataclass와 유사한 동작을 부여한다는 것을 알려준다.

decorator

_T = TypeVar("_T")

# The ``create_model`` decorator is defined by a library.
# This could be in a type stub or inline.
@typing.dataclass_transform()
def create_model(cls: Type[_T]) -> Type[_T]:
    cls.__init__ = ...
    cls.__eq__ = ...
    cls.__ne__ = ...
    return cls

# The ``create_model`` decorator can now be used to create new model
# classes, like this:
@create_model
class CustomerModel:
    id: int
    name: str

class

# The ``ModelBase`` class is defined by a library. This could be in
# a type stub or inline.
@typing.dataclass_transform()
class ModelBase: ...

# The ``ModelBase`` class can now be used to create new model
# subclasses, like this:
class CustomerModel(ModelBase):
    id: int
    name: str

metaclass example

# The ``ModelMeta`` metaclass and ``ModelBase`` class are defined by
# a library. This could be in a type stub or inline.
@typing.dataclass_transform()
class ModelMeta(type): ...

class ModelBase(metaclass=ModelMeta): ...

# The ``ModelBase`` class can now be used to create new model
# subclasses, like this:
class CustomerModel(ModelBase):
    id: int
    name: str

개인적인 생각

읽으면서 느낀점은, 이 기능은 일반 사용자가 아니라, 라이브러리 제작자들을 위한 기능 같다는 생각이 들었다.

references

https://peps.python.org/pep-0681/