-
-
Notifications
You must be signed in to change notification settings - Fork 32.5k
Open
Labels
stdlibPython modules in the Lib dirPython modules in the Lib dirtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
See #118099 (comment) and #118033
We now correctly check for __dictoffset__
and __weakoffset__
on C types without __slots__
defined:
Lines 1201 to 1212 in c68acb1
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:
Lines 1213 to 1218 in c68acb1
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!
carljm
Metadata
Metadata
Assignees
Labels
stdlibPython modules in the Lib dirPython modules in the Lib dirtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error