Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to PEP 681 dataclasses #4241

Merged
merged 4 commits into from Aug 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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