slots = []
if getattr(cls, '__weakrefoffset__', -1) != 0:
slots.append('__weakref__')
- if getattr(cls, '__dictrefoffset__', -1) != 0:
+ if getattr(cls, '__dictoffset__', -1) != 0:
slots.append('__dict__')
yield from slots
case str(slot):
self.assertEqual(A().__dict__, {})
A()
+ @support.cpython_only
+ def test_dataclass_slot_dict_ctype(self):
+ # https://github.com/python/cpython/issues/123935
+ from test.support import import_helper
+ # Skips test if `_testcapi` is not present:
+ _testcapi = import_helper.import_module('_testcapi')
+
+ @dataclass(slots=True)
+ class HasDictOffset(_testcapi.HeapCTypeWithDict):
+ __dict__: dict = {}
+ self.assertNotEqual(_testcapi.HeapCTypeWithDict.__dictoffset__, 0)
+ self.assertEqual(HasDictOffset.__slots__, ())
+
+ @dataclass(slots=True)
+ class DoesNotHaveDictOffset(_testcapi.HeapCTypeWithWeakref):
+ __dict__: dict = {}
+ self.assertEqual(_testcapi.HeapCTypeWithWeakref.__dictoffset__, 0)
+ self.assertEqual(DoesNotHaveDictOffset.__slots__, ('__dict__',))
+
@support.cpython_only
def test_slots_with_wrong_init_subclass(self):
# TODO: This test is for a kinda-buggy behavior.