Skip to content

Always check for __dictrefoffset__ and __weakoffset__ in dataclasses with slots #118829

Open
@sobolevn

Description

@sobolevn

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

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:

cpython/Lib/dataclasses.py

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!

Metadata

Metadata

Assignees

Labels

stdlibPython modules in the Lib dirtype-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions