mirror of
https://github.com/python/cpython.git
synced 2025-08-28 12:45:07 +00:00
bpo-32960: For dataclasses, disallow inheriting frozen from non-frozen classes and vice-versa, (GH-5919)
This restriction will be relaxed at a future date.
This commit is contained in:
parent
72d9b2be36
commit
2fa6b9eae0
3 changed files with 77 additions and 29 deletions
|
@ -637,29 +637,6 @@ class TestCase(unittest.TestCase):
|
|||
y: int
|
||||
self.assertNotEqual(Point(1, 3), C(1, 3))
|
||||
|
||||
def test_frozen(self):
|
||||
@dataclass(frozen=True)
|
||||
class C:
|
||||
i: int
|
||||
|
||||
c = C(10)
|
||||
self.assertEqual(c.i, 10)
|
||||
with self.assertRaises(FrozenInstanceError):
|
||||
c.i = 5
|
||||
self.assertEqual(c.i, 10)
|
||||
|
||||
# Check that a derived class is still frozen, even if not
|
||||
# marked so.
|
||||
@dataclass
|
||||
class D(C):
|
||||
pass
|
||||
|
||||
d = D(20)
|
||||
self.assertEqual(d.i, 20)
|
||||
with self.assertRaises(FrozenInstanceError):
|
||||
d.i = 5
|
||||
self.assertEqual(d.i, 20)
|
||||
|
||||
def test_not_tuple(self):
|
||||
# Test that some of the problems with namedtuple don't happen
|
||||
# here.
|
||||
|
@ -2475,5 +2452,66 @@ class TestHash(unittest.TestCase):
|
|||
assert False, f'unknown value for expected={expected!r}'
|
||||
|
||||
|
||||
class TestFrozen(unittest.TestCase):
|
||||
def test_frozen(self):
|
||||
@dataclass(frozen=True)
|
||||
class C:
|
||||
i: int
|
||||
|
||||
c = C(10)
|
||||
self.assertEqual(c.i, 10)
|
||||
with self.assertRaises(FrozenInstanceError):
|
||||
c.i = 5
|
||||
self.assertEqual(c.i, 10)
|
||||
|
||||
def test_inherit(self):
|
||||
@dataclass(frozen=True)
|
||||
class C:
|
||||
i: int
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class D(C):
|
||||
j: int
|
||||
|
||||
d = D(0, 10)
|
||||
with self.assertRaises(FrozenInstanceError):
|
||||
d.i = 5
|
||||
self.assertEqual(d.i, 0)
|
||||
|
||||
def test_inherit_from_nonfrozen_from_frozen(self):
|
||||
@dataclass(frozen=True)
|
||||
class C:
|
||||
i: int
|
||||
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
'cannot inherit non-frozen dataclass from a frozen one'):
|
||||
@dataclass
|
||||
class D(C):
|
||||
pass
|
||||
|
||||
def test_inherit_from_frozen_from_nonfrozen(self):
|
||||
@dataclass
|
||||
class C:
|
||||
i: int
|
||||
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
'cannot inherit frozen dataclass from a non-frozen one'):
|
||||
@dataclass(frozen=True)
|
||||
class D(C):
|
||||
pass
|
||||
|
||||
def test_inherit_from_normal_class(self):
|
||||
class C:
|
||||
pass
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class D(C):
|
||||
i: int
|
||||
|
||||
d = D(10)
|
||||
with self.assertRaises(FrozenInstanceError):
|
||||
d.i = 5
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue