diff options
author | Aviel Boag <avboag@gmail.com> | 2024-03-19 00:53:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-19 00:53:14 (GMT) |
commit | a22d05f04c074dbb4f71e7837f54c0bb693db75d (patch) | |
tree | a7634e879f7d77156e15f73402924ff21c92b976 | |
parent | 1d82a41235ac5619d36ac7e289fcbb686c1d9350 (diff) | |
download | cpython-a22d05f04c074dbb4f71e7837f54c0bb693db75d.zip cpython-a22d05f04c074dbb4f71e7837f54c0bb693db75d.tar.gz cpython-a22d05f04c074dbb4f71e7837f54c0bb693db75d.tar.bz2 |
gh-105866: fix dataclass with slots=True, weakref_slot=True (#105870)
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>
-rw-r--r-- | Lib/dataclasses.py | 4 | ||||
-rw-r--r-- | Lib/test/test_dataclasses/__init__.py | 11 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2023-06-16-19-17-06.gh-issue-105866.0NBveV.rst | 1 |
3 files changed, 15 insertions, 1 deletions
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 45ce5a9..e511eff 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -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 diff --git a/Lib/test/test_dataclasses/__init__.py b/Lib/test/test_dataclasses/__init__.py index ede74b0..e27abac 100644 --- a/Lib/test/test_dataclasses/__init__.py +++ b/Lib/test/test_dataclasses/__init__.py @@ -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 index 0000000..28eae12 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-06-16-19-17-06.gh-issue-105866.0NBveV.rst @@ -0,0 +1 @@ +Fixed ``_get_slots`` bug which caused error when defining dataclasses with slots and a weakref_slot. |