Python
[python documents] python3.11 pep 681(Data class transforms)
nebulayoon
2024. 8. 4. 12:28
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
개인적인 생각
읽으면서 느낀점은, 이 기능은 일반 사용자가 아니라, 라이브러리 제작자들을 위한 기능 같다는 생각이 들었다.