Skip to content

Commit b595c73

Browse files
dataclass_transform: accept **kwargs, rename field_descriptors (#1120)
1 parent 35dff91 commit b595c73

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

typing_extensions/CHANGELOG

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Unreleased
22

3+
- Update `typing_extensions.dataclass_transform` to rename the
4+
`field_descriptors` parameter to `field_specifiers` and accept
5+
arbitrary keyword arguments.
36
- Add `typing_extensions.get_overloads` and
47
`typing_extensions.clear_overloads`, and add registry support to
58
`typing_extensions.overload`. Backport from python/cpython#89263.

typing_extensions/src/test_typing_extensions.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -2718,7 +2718,8 @@ class CustomerModel:
27182718
"eq_default": True,
27192719
"order_default": False,
27202720
"kw_only_default": True,
2721-
"field_descriptors": (),
2721+
"field_specifiers": (),
2722+
"kwargs": {},
27222723
}
27232724
)
27242725
self.assertIs(
@@ -2730,7 +2731,12 @@ def test_base_class(self):
27302731
class ModelBase:
27312732
def __init_subclass__(cls, *, frozen: bool = False): ...
27322733

2733-
Decorated = dataclass_transform(eq_default=True, order_default=True)(ModelBase)
2734+
Decorated = dataclass_transform(
2735+
eq_default=True,
2736+
order_default=True,
2737+
# Arbitrary unrecognized kwargs are accepted at runtime.
2738+
make_everything_awesome=True,
2739+
)(ModelBase)
27342740

27352741
class CustomerModel(Decorated, frozen=True):
27362742
id: int
@@ -2742,7 +2748,8 @@ class CustomerModel(Decorated, frozen=True):
27422748
"eq_default": True,
27432749
"order_default": True,
27442750
"kw_only_default": False,
2745-
"field_descriptors": (),
2751+
"field_specifiers": (),
2752+
"kwargs": {"make_everything_awesome": True},
27462753
}
27472754
)
27482755
self.assertIsSubclass(CustomerModel, Decorated)
@@ -2757,7 +2764,7 @@ def __new__(
27572764
return super().__new__(cls, name, bases, namespace)
27582765

27592766
Decorated = dataclass_transform(
2760-
order_default=True, field_descriptors=(Field,)
2767+
order_default=True, field_specifiers=(Field,)
27612768
)(ModelMeta)
27622769

27632770
class ModelBase(metaclass=Decorated): ...
@@ -2772,7 +2779,8 @@ class CustomerModel(ModelBase, init=False):
27722779
"eq_default": True,
27732780
"order_default": True,
27742781
"kw_only_default": False,
2775-
"field_descriptors": (Field,),
2782+
"field_specifiers": (Field,),
2783+
"kwargs": {},
27762784
}
27772785
)
27782786
self.assertIsInstance(CustomerModel, Decorated)

typing_extensions/src/typing_extensions.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -1866,10 +1866,11 @@ def dataclass_transform(
18661866
eq_default: bool = True,
18671867
order_default: bool = False,
18681868
kw_only_default: bool = False,
1869-
field_descriptors: typing.Tuple[
1869+
field_specifiers: typing.Tuple[
18701870
typing.Union[typing.Type[typing.Any], typing.Callable[..., typing.Any]],
18711871
...
18721872
] = (),
1873+
**kwargs: typing.Any,
18731874
) -> typing.Callable[[T], T]:
18741875
"""Decorator that marks a function, class, or metaclass as providing
18751876
dataclass-like behavior.
@@ -1921,8 +1922,8 @@ class CustomerModel(ModelBase):
19211922
assumed to be True or False if it is omitted by the caller.
19221923
- ``kw_only_default`` indicates whether the ``kw_only`` parameter is
19231924
assumed to be True or False if it is omitted by the caller.
1924-
- ``field_descriptors`` specifies a static list of supported classes
1925-
or functions, that describe fields, similar to ``dataclasses.field()``.
1925+
- ``field_specifiers`` specifies a static list of supported classes
1926+
or functions that describe fields, similar to ``dataclasses.field()``.
19261927
19271928
At runtime, this decorator records its arguments in the
19281929
``__dataclass_transform__`` attribute on the decorated object.
@@ -1935,7 +1936,8 @@ def decorator(cls_or_fn):
19351936
"eq_default": eq_default,
19361937
"order_default": order_default,
19371938
"kw_only_default": kw_only_default,
1938-
"field_descriptors": field_descriptors,
1939+
"field_specifiers": field_specifiers,
1940+
"kwargs": kwargs,
19391941
}
19401942
return cls_or_fn
19411943
return decorator

0 commit comments

Comments
 (0)