summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikita Sobolev <mail@sobolevn.me>2022-10-04 16:53:28 (GMT)
committerGitHub <noreply@github.com>2022-10-04 16:53:28 (GMT)
commit4f380db1a539bf7ae157d1e0791b5ac3fecfcf01 (patch)
treed4487b0655da08981e897e9fe1e4d904c5eb0c58
parent53503ff60e9a4727af0d9a1096418675e72a0fae (diff)
downloadcpython-4f380db1a539bf7ae157d1e0791b5ac3fecfcf01.zip
cpython-4f380db1a539bf7ae157d1e0791b5ac3fecfcf01.tar.gz
cpython-4f380db1a539bf7ae157d1e0791b5ac3fecfcf01.tar.bz2
gh-96142: add missing params to `dataclass._DataclassParams` (gh-96382)
-rw-r--r--Lib/dataclasses.py22
-rw-r--r--Lib/test/test_dataclasses.py26
-rw-r--r--Misc/NEWS.d/next/Library/2022-08-29-12-49-30.gh-issue-96142.PdCMez.rst2
3 files changed, 47 insertions, 3 deletions
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py
index efd8346..65fb8f2 100644
--- a/Lib/dataclasses.py
+++ b/Lib/dataclasses.py
@@ -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
diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py
index e2eab69..328dcdc 100644
--- a/Lib/test/test_dataclasses.py
+++ b/Lib/test/test_dataclasses.py
@@ -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:
diff --git a/Misc/NEWS.d/next/Library/2022-08-29-12-49-30.gh-issue-96142.PdCMez.rst b/Misc/NEWS.d/next/Library/2022-08-29-12-49-30.gh-issue-96142.PdCMez.rst
new file mode 100644
index 0000000..43d1c3d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-08-29-12-49-30.gh-issue-96142.PdCMez.rst
@@ -0,0 +1,2 @@
+Add ``match_args``, ``kw_only``, ``slots``, and ``weakref_slot`` to
+``_DataclassParams``.