[3.12] gh-89683: add tests for `deepcopy` on frozen dataclasses (GH-123098) by picnixz · Pull Request #124679 · python/cpython
import typing # Needed for the string "typing.ClassVar[int]" to work as an annotation.
def test_frozen_deepcopy_without_slots(self): # see: https://github.com/python/cpython/issues/89683 @dataclass(frozen=True, slots=False) class C: s: str
c = C('hello') self.assertEqual(deepcopy(c), c)
def test_frozen_deepcopy_with_slots(self): # see: https://github.com/python/cpython/issues/89683 with self.subTest('generated __slots__'): @dataclass(frozen=True, slots=True) class C: s: str
c = C('hello') self.assertEqual(deepcopy(c), c)
with self.subTest('user-defined __slots__ and no __{get,set}state__'): @dataclass(frozen=True, slots=False) class C: __slots__ = ('s',) s: str
# with user-defined slots, __getstate__ and __setstate__ are not # automatically added, hence the error err = r"^cannot\ assign\ to\ field\ 's'$" self.assertRaisesRegex(FrozenInstanceError, err, deepcopy, C(''))
with self.subTest('user-defined __slots__ and __{get,set}state__'): @dataclass(frozen=True, slots=False) class C: __slots__ = ('s',) __getstate__ = dataclasses._dataclass_getstate __setstate__ = dataclasses._dataclass_setstate
s: str
c = C('hello') self.assertEqual(deepcopy(c), c)
class TestSlots(unittest.TestCase): def test_simple(self):