Bug report
See #118099 (comment) and #118033
We now correctly check for __dictoffset__ and __weakoffset__ on C types without __slots__ defined:
|
match cls.__dict__.get('__slots__'): |
|
# `__dictoffset__` and `__weakrefoffset__` can tell us whether |
|
# the base type has dict/weakref slots, in a way that works correctly |
|
# for both Python classes and C extension types. Extension types |
|
# don't use `__slots__` for slot creation |
|
case None: |
|
slots = [] |
|
if getattr(cls, '__weakrefoffset__', -1) != 0: |
|
slots.append('__weakref__') |
|
if getattr(cls, '__dictrefoffset__', -1) != 0: |
|
slots.append('__dict__') |
|
yield from slots |
But, not in this case:
|
case str(slot): |
|
yield slot |
|
# Slots may be any iterable, but we cannot handle an iterator |
|
# because it will already be (partially) consumed. |
|
case iterable if not hasattr(iterable, '__next__'): |
|
yield from iterable |
So, in theory there might be C types with __slots__ and __dictoffset__ and __weakoffset__.
I will investigate!
Bug report
See #118099 (comment) and #118033
We now correctly check for
__dictoffset__and__weakoffset__on C types without__slots__defined:cpython/Lib/dataclasses.py
Lines 1201 to 1212 in c68acb1
But, not in this case:
cpython/Lib/dataclasses.py
Lines 1213 to 1218 in c68acb1
So, in theory there might be C types with
__slots__and__dictoffset__and__weakoffset__.I will investigate!