Closed
Description
We recently discovered the following error in our project:
TypeError: descriptor '__weakref__' for 'XYZ' objects doesn't apply to a 'XYZ' object
XYZ in our case is a dataclass which uses slots (added v3.10) and weakref_slot (added v3.11) parameters.
We further investigated the error and have come to the following example to reproduce it:
import dataclasses
import weakref
@dataclasses.dataclass(slots=True, weakref_slot=True)
class EntityAsDataclass:
x: int = 10
class Entity:
__slots__ = ("x", "__weakref__")
def __init__(self, x: int = 10) -> None:
self.x = x
e1 = Entity()
e1_ref = weakref.ref(e1)
e2 = EntityAsDataclass()
e2_ref = weakref.ref(e2)
assert e1.__weakref__ is e1_ref # works
assert e2.__weakref__ is e2_ref # fails with "TypeError: descriptor '__weakref__' for 'EntityAsDataclass' objects doesn't apply to a 'EntityAsDataclass' object"
I don't know if this is intended, but we expect EntityAsDataclass and Entity to have the same behavior here.
Thanks!