diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2024-03-19 10:57:31 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-19 10:57:31 (GMT) |
commit | 23f97327fe7001118b51a69084b571a3da2e0cf0 (patch) | |
tree | cb25657d8e42692e09b760b9e310880ba137f271 /Lib | |
parent | e1f890828e15d68a5e05a7edf2d53ca44b621c33 (diff) | |
download | cpython-23f97327fe7001118b51a69084b571a3da2e0cf0.zip cpython-23f97327fe7001118b51a69084b571a3da2e0cf0.tar.gz cpython-23f97327fe7001118b51a69084b571a3da2e0cf0.tar.bz2 |
[3.12] gh-105866: fix dataclass with slots=True, weakref_slot=True (GH-105870) (GH-116978)
(cherry picked from commit a22d05f04c074dbb4f71e7837f54c0bb693db75d)
Co-authored-by: Aviel Boag <avboag@gmail.com>
Co-authored-by: Kirill Podoprigora <kirill.bast9@mail.ru>
Co-authored-by: Carl Meyer <carl@oddbird.net>
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/dataclasses.py | 4 | ||||
-rw-r--r-- | Lib/test/test_dataclasses/__init__.py | 11 |
2 files changed, 14 insertions, 1 deletions
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 3eacba8..12b2dfd 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -1168,8 +1168,10 @@ def _dataclass_setstate(self, state): def _get_slots(cls): match cls.__dict__.get('__slots__'): + # A class which does not define __slots__ at all is equivalent + # to a class defining __slots__ = ('__dict__', '__weakref__') case None: - return + yield from ('__dict__', '__weakref__') case str(slot): yield slot # Slots may be any iterable, but we cannot handle an iterator diff --git a/Lib/test/test_dataclasses/__init__.py b/Lib/test/test_dataclasses/__init__.py index 639631c..4e05506 100644 --- a/Lib/test/test_dataclasses/__init__.py +++ b/Lib/test/test_dataclasses/__init__.py @@ -3403,6 +3403,17 @@ class TestSlots(unittest.TestCase): self.assertIs(a.__weakref__, a_ref) + def test_dataclass_derived_weakref_slot(self): + class A: + pass + + @dataclass(slots=True, weakref_slot=True) + class B(A): + pass + + B() + + class TestDescriptors(unittest.TestCase): def test_set_name(self): # See bpo-33141. |