Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

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

Copy link
Copy link
Open
@sobolevn

Description

@sobolevn
Issue body actions

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 dirPython modules in the Lib dirtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    Morty Proxy This is a proxified and sanitized view of the page, visit original site.