diff options
author | Bluenix <bluenixdev@gmail.com> | 2022-06-08 00:53:08 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-08 00:53:08 (GMT) |
commit | 5849af7a80166e9e82040e082f22772bd7cf3061 (patch) | |
tree | fa94a6b81bbdf006040f1275942a40cb91918b4c /Lib/test/test_dataclasses.py | |
parent | ffc58a9710172b2d716a810a9f303828f3ebf108 (diff) | |
download | cpython-5849af7a80166e9e82040e082f22772bd7cf3061.zip cpython-5849af7a80166e9e82040e082f22772bd7cf3061.tar.gz cpython-5849af7a80166e9e82040e082f22772bd7cf3061.tar.bz2 |
GH-93521: For dataclasses, filter out `__weakref__` slot if present in bases (GH-93535)
Diffstat (limited to 'Lib/test/test_dataclasses.py')
-rw-r--r-- | Lib/test/test_dataclasses.py | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index cf29cd0..98dfab4 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -3109,6 +3109,54 @@ class TestSlots(unittest.TestCase): "weakref_slot is True but slots is False"): B = make_dataclass('B', [('a', int),], weakref_slot=True) + def test_weakref_slot_subclass_weakref_slot(self): + @dataclass(slots=True, weakref_slot=True) + class Base: + field: int + + # A *can* also specify weakref_slot=True if it wants to (gh-93521) + @dataclass(slots=True, weakref_slot=True) + class A(Base): + ... + + # __weakref__ is in the base class, not A. But an instance of A + # is still weakref-able. + self.assertIn("__weakref__", Base.__slots__) + self.assertNotIn("__weakref__", A.__slots__) + a = A(1) + weakref.ref(a) + + def test_weakref_slot_subclass_no_weakref_slot(self): + @dataclass(slots=True, weakref_slot=True) + class Base: + field: int + + @dataclass(slots=True) + class A(Base): + ... + + # __weakref__ is in the base class, not A. Even though A doesn't + # specify weakref_slot, it should still be weakref-able. + self.assertIn("__weakref__", Base.__slots__) + self.assertNotIn("__weakref__", A.__slots__) + a = A(1) + weakref.ref(a) + + def test_weakref_slot_normal_base_weakref_slot(self): + class Base: + __slots__ = ('__weakref__',) + + @dataclass(slots=True, weakref_slot=True) + class A(Base): + field: int + + # __weakref__ is in the base class, not A. But an instance of + # A is still weakref-able. + self.assertIn("__weakref__", Base.__slots__) + self.assertNotIn("__weakref__", A.__slots__) + a = A(1) + weakref.ref(a) + class TestDescriptors(unittest.TestCase): def test_set_name(self): |