diff --git a/changes/4241-multimeric.md b/changes/4241-multimeric.md new file mode 100644 index 0000000000..51a4deace2 --- /dev/null +++ b/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/). diff --git a/pydantic/dataclasses.py b/pydantic/dataclasses.py index 1a9008cc6c..23178cf8f7 100644 --- a/pydantic/dataclasses.py +++ b/pydantic/dataclasses.py @@ -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: @@ -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( *, @@ -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], @@ -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( *, @@ -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], @@ -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, *, diff --git a/pydantic/main.py b/pydantic/main.py index 9f2b68dc12..01afe5fc65 100644 --- a/pydantic/main.py +++ b/pydantic/main.py @@ -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 @@ -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') @@ -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