bpo-43176: Fix processing of empty dataclasses (GH-24484)
When a dataclass inherits from an empty base, all immutability checks are omitted. This PR fixes this and adds tests for it. Automerge-Triggered-By: GH:ericvsmith
This commit is contained in:
parent
4663e5f39e
commit
376ffc6ac4
@ -860,7 +860,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen):
|
|||||||
# Only process classes that have been processed by our
|
# Only process classes that have been processed by our
|
||||||
# decorator. That is, they have a _FIELDS attribute.
|
# decorator. That is, they have a _FIELDS attribute.
|
||||||
base_fields = getattr(b, _FIELDS, None)
|
base_fields = getattr(b, _FIELDS, None)
|
||||||
if base_fields:
|
if base_fields is not None:
|
||||||
has_dataclass_bases = True
|
has_dataclass_bases = True
|
||||||
for f in base_fields.values():
|
for f in base_fields.values():
|
||||||
fields[f.name] = f
|
fields[f.name] = f
|
||||||
|
@ -2594,6 +2594,30 @@ class TestFrozen(unittest.TestCase):
|
|||||||
self.assertEqual(d.i, 0)
|
self.assertEqual(d.i, 0)
|
||||||
self.assertEqual(d.j, 10)
|
self.assertEqual(d.j, 10)
|
||||||
|
|
||||||
|
def test_inherit_nonfrozen_from_empty_frozen(self):
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class C:
|
||||||
|
pass
|
||||||
|
|
||||||
|
with self.assertRaisesRegex(TypeError,
|
||||||
|
'cannot inherit non-frozen dataclass from a frozen one'):
|
||||||
|
@dataclass
|
||||||
|
class D(C):
|
||||||
|
j: int
|
||||||
|
|
||||||
|
def test_inherit_nonfrozen_from_empty(self):
|
||||||
|
@dataclass
|
||||||
|
class C:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class D(C):
|
||||||
|
j: int
|
||||||
|
|
||||||
|
d = D(3)
|
||||||
|
self.assertEqual(d.j, 3)
|
||||||
|
self.assertIsInstance(d, C)
|
||||||
|
|
||||||
# Test both ways: with an intermediate normal (non-dataclass)
|
# Test both ways: with an intermediate normal (non-dataclass)
|
||||||
# class and without an intermediate class.
|
# class and without an intermediate class.
|
||||||
def test_inherit_nonfrozen_from_frozen(self):
|
def test_inherit_nonfrozen_from_frozen(self):
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
Fixed processing of empty dataclasses.
|
Loading…
x
Reference in New Issue
Block a user