]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-105866: fix dataclass with slots=True, weakref_slot=True (#105870)
authorAviel Boag <avboag@gmail.com>
Tue, 19 Mar 2024 00:53:14 +0000 (02:53 +0200)
committerGitHub <noreply@github.com>
Tue, 19 Mar 2024 00:53:14 +0000 (18:53 -0600)
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Co-authored-by: Kirill Podoprigora <kirill.bast9@mail.ru>
Co-authored-by: Carl Meyer <carl@oddbird.net>
Lib/dataclasses.py
Lib/test/test_dataclasses/__init__.py
Misc/NEWS.d/next/Library/2023-06-16-19-17-06.gh-issue-105866.0NBveV.rst [new file with mode: 0644]

index 45ce5a98b51ae06b30eb68133a89d6cbc07e0d2b..e511eff4125038194317650c60924ef591df1b9d 100644 (file)
@@ -1159,8 +1159,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
index ede74b0dd15ccfc6d45be36566f09671b6460b98..e27abac511139429e4a3d49166e1d4dbb6250096 100644 (file)
@@ -3498,6 +3498,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.
diff --git a/Misc/NEWS.d/next/Library/2023-06-16-19-17-06.gh-issue-105866.0NBveV.rst b/Misc/NEWS.d/next/Library/2023-06-16-19-17-06.gh-issue-105866.0NBveV.rst
new file mode 100644 (file)
index 0000000..28eae12
--- /dev/null
@@ -0,0 +1 @@
+Fixed ``_get_slots`` bug which caused error when defining dataclasses with slots and a weakref_slot.