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
'Python' 카테고리의 다른 글
[fastapi documents] OpenAPI operationId (0) | 2024.08.17 |
---|---|
[python documents] python3.11 pep655 TypeDict (0) | 2024.08.11 |
[python documents] python3.11 pep594 사용 중단된 기본 모듈 목록 (0) | 2024.08.10 |
[python documents] python3.11 pep654(ExceptionGroup) (0) | 2024.08.04 |
[Python documents] python3.11 속도 (0) | 2024.07.28 |