gh-96142: add missing params to `dataclass._DataclassParams` (gh-96382)

This commit is contained in:
Nikita Sobolev 2022-10-04 19:53:28 +03:00 committed by GitHub
parent 53503ff60e
commit 4f380db1a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 3 deletions

View File

@ -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

View File

@ -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:

View File

@ -0,0 +1,2 @@
Add ``match_args``, ``kw_only``, ``slots``, and ``weakref_slot`` to
``_DataclassParams``.