summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-03-19 10:57:31 (GMT)
committerGitHub <noreply@github.com>2024-03-19 10:57:31 (GMT)
commit23f97327fe7001118b51a69084b571a3da2e0cf0 (patch)
treecb25657d8e42692e09b760b9e310880ba137f271 /Lib
parente1f890828e15d68a5e05a7edf2d53ca44b621c33 (diff)
downloadcpython-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.py4
-rw-r--r--Lib/test/test_dataclasses/__init__.py11
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.