mirror of https://github.com/python/cpython
gh-96142: add missing params to `dataclass._DataclassParams` (gh-96382)
This commit is contained in:
parent
53503ff60e
commit
4f380db1a5
|
@ -320,15 +320,25 @@ class _DataclassParams:
|
|||
'order',
|
||||
'unsafe_hash',
|
||||
'frozen',
|
||||
'match_args',
|
||||
'kw_only',
|
||||
'slots',
|
||||
'weakref_slot',
|
||||
)
|
||||
|
||||
def __init__(self, init, repr, eq, order, unsafe_hash, frozen):
|
||||
def __init__(self,
|
||||
init, repr, eq, order, unsafe_hash, frozen,
|
||||
match_args, kw_only, slots, weakref_slot):
|
||||
self.init = init
|
||||
self.repr = repr
|
||||
self.eq = eq
|
||||
self.order = order
|
||||
self.unsafe_hash = unsafe_hash
|
||||
self.frozen = frozen
|
||||
self.match_args = match_args
|
||||
self.kw_only = kw_only
|
||||
self.slots = slots
|
||||
self.weakref_slot = weakref_slot
|
||||
|
||||
def __repr__(self):
|
||||
return ('_DataclassParams('
|
||||
|
@ -337,7 +347,11 @@ class _DataclassParams:
|
|||
f'eq={self.eq!r},'
|
||||
f'order={self.order!r},'
|
||||
f'unsafe_hash={self.unsafe_hash!r},'
|
||||
f'frozen={self.frozen!r}'
|
||||
f'frozen={self.frozen!r},'
|
||||
f'match_args={self.match_args!r},'
|
||||
f'kw_only={self.kw_only!r},'
|
||||
f'slots={self.slots!r},'
|
||||
f'weakref_slot={self.weakref_slot!r}'
|
||||
')')
|
||||
|
||||
|
||||
|
@ -905,7 +919,9 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen,
|
|||
globals = {}
|
||||
|
||||
setattr(cls, _PARAMS, _DataclassParams(init, repr, eq, order,
|
||||
unsafe_hash, frozen))
|
||||
unsafe_hash, frozen,
|
||||
match_args, kw_only,
|
||||
slots, weakref_slot))
|
||||
|
||||
# Find our base classes in reverse MRO order, and exclude
|
||||
# ourselves. In reversed order so that more derived classes
|
||||
|
|
|
@ -68,6 +68,32 @@ class TestCase(unittest.TestCase):
|
|||
|
||||
self.assertEqual(repr_output, expected_output)
|
||||
|
||||
def test_dataclass_params_repr(self):
|
||||
# Even though this is testing an internal implementation detail,
|
||||
# it's testing a feature we want to make sure is correctly implemented
|
||||
# for the sake of dataclasses itself
|
||||
@dataclass(slots=True, frozen=True)
|
||||
class Some: pass
|
||||
|
||||
repr_output = repr(Some.__dataclass_params__)
|
||||
expected_output = "_DataclassParams(init=True,repr=True," \
|
||||
"eq=True,order=False,unsafe_hash=False,frozen=True," \
|
||||
"match_args=True,kw_only=False," \
|
||||
"slots=True,weakref_slot=False)"
|
||||
self.assertEqual(repr_output, expected_output)
|
||||
|
||||
def test_dataclass_params_signature(self):
|
||||
# Even though this is testing an internal implementation detail,
|
||||
# it's testing a feature we want to make sure is correctly implemented
|
||||
# for the sake of dataclasses itself
|
||||
@dataclass
|
||||
class Some: pass
|
||||
|
||||
for param in inspect.signature(dataclass).parameters:
|
||||
if param == 'cls':
|
||||
continue
|
||||
self.assertTrue(hasattr(Some.__dataclass_params__, param), msg=param)
|
||||
|
||||
def test_named_init_params(self):
|
||||
@dataclass
|
||||
class C:
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Add ``match_args``, ``kw_only``, ``slots``, and ``weakref_slot`` to
|
||||
``_DataclassParams``.
|
Loading…
Reference in New Issue