Skip to content

Commit

Permalink
Update to PEP 681 dataclasses (#4241)
Browse files Browse the repository at this point in the history
* Update to PEP 681 dataclasses

* Add changes file

* Pre-commit

Co-authored-by: Samuel Colvin <s@muelcolvin.com>
  • Loading branch information
multimeric and samuelcolvin committed Aug 9, 2022
1 parent b59a85a commit 86b8486
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 17 deletions.
1 change: 1 addition & 0 deletions changes/4241-multimeric.md
@@ -0,0 +1 @@
The use of `__dataclass_transform__` has been replaced by `typing_extensions.dataclass_transform`, which is the preferred way to mark pydantic models as a dataclass under [PEP 681](https://peps.python.org/pep-0681/).
14 changes: 8 additions & 6 deletions pydantic/dataclasses.py
Expand Up @@ -36,12 +36,14 @@ class M:
from functools import wraps
from typing import TYPE_CHECKING, Any, Callable, ClassVar, Dict, Generator, Optional, Type, TypeVar, Union, overload

from typing_extensions import dataclass_transform

from .class_validators import gather_all_validators
from .config import BaseConfig, ConfigDict, Extra, get_config
from .error_wrappers import ValidationError
from .errors import DataclassTypeError
from .fields import Field, FieldInfo, Required, Undefined
from .main import __dataclass_transform__, create_model, validate_model
from .main import create_model, validate_model
from .utils import ClassAttribute

if TYPE_CHECKING:
Expand Down Expand Up @@ -88,7 +90,7 @@ def __validate__(cls: Type['DataclassT'], v: Any) -> 'DataclassT':

if sys.version_info >= (3, 10):

@__dataclass_transform__(kw_only_default=True, field_descriptors=(Field, FieldInfo))
@dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo))
@overload
def dataclass(
*,
Expand All @@ -104,7 +106,7 @@ def dataclass(
) -> Callable[[Type[Any]], 'DataclassClassOrWrapper']:
...

@__dataclass_transform__(kw_only_default=True, field_descriptors=(Field, FieldInfo))
@dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo))
@overload
def dataclass(
_cls: Type[Any],
Expand All @@ -123,7 +125,7 @@ def dataclass(

else:

@__dataclass_transform__(kw_only_default=True, field_descriptors=(Field, FieldInfo))
@dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo))
@overload
def dataclass(
*,
Expand All @@ -138,7 +140,7 @@ def dataclass(
) -> Callable[[Type[Any]], 'DataclassClassOrWrapper']:
...

@__dataclass_transform__(kw_only_default=True, field_descriptors=(Field, FieldInfo))
@dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo))
@overload
def dataclass(
_cls: Type[Any],
Expand All @@ -155,7 +157,7 @@ def dataclass(
...


@__dataclass_transform__(kw_only_default=True, field_descriptors=(Field, FieldInfo))
@dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo))
def dataclass(
_cls: Optional[Type[Any]] = None,
*,
Expand Down
14 changes: 3 additions & 11 deletions pydantic/main.py
Expand Up @@ -24,6 +24,8 @@
overload,
)

from typing_extensions import dataclass_transform

from .class_validators import ValidatorGroup, extract_root_validators, extract_validators, inherit_validators
from .config import BaseConfig, Extra, inherit_config, prepare_config
from .error_wrappers import ErrorWrapper, ValidationError
Expand Down Expand Up @@ -93,16 +95,6 @@
_T = TypeVar('_T')


def __dataclass_transform__(
*,
eq_default: bool = True,
order_default: bool = False,
kw_only_default: bool = False,
field_descriptors: Tuple[Union[type, Callable[..., Any]], ...] = (()),
) -> Callable[[_T], _T]:
return lambda a: a


def validate_custom_root_type(fields: Dict[str, ModelField]) -> None:
if len(fields) > 1:
raise ValueError(f'{ROOT_KEY} cannot be mixed with other fields')
Expand All @@ -126,7 +118,7 @@ def hash_function(self_: Any) -> int:
_is_base_model_class_defined = False


@__dataclass_transform__(kw_only_default=True, field_descriptors=(Field, FieldInfo))
@dataclass_transform(kw_only_default=True, field_descriptors=(Field, FieldInfo))
class ModelMetaclass(ABCMeta):
@no_type_check # noqa C901
def __new__(mcs, name, bases, namespace, **kwargs): # noqa C901
Expand Down

0 comments on commit 86b8486

Please sign in to comment.