python / cpython

The Python programming language
https://www.python.org
Other
63.2k stars 30.27k forks source link

dataclasses: pickling frozen dataclasses which derive from classes with slots does not work. #105877

Open avboag opened 1 year ago

avboag commented 1 year ago

Bug report

The following code does not work:

class SlotNonDataclass:
    __slots__ = ("foo",)

    def __init__(self, foo: str):
        # To support frozen derived classes.
        object.__setattr__(self, "foo", foo)

@dataclass(frozen=True)
class FrozenDerivingSlotsClass(SlotNonDataclass):
    bar: int

    def __init__(self, foo: str, bar: int):
        # super() without arguments does not work with slots=True,
        # as the actual class is different from the one we have here.
        super(TestFrozen.FrozenDerivingSlotsClass, self).__init__(foo)
        object.__setattr__(self, "bar", bar)

obj = FrozenDerivingSlotsClass("a", 1)
p = pickle.loads(pickle.dumps(obj))

assert obj.foo == p.foo
assert obj.bar == p.bar

Linked PRs

avboag commented 7 months ago

ping

avboag commented 5 months ago

ping

avboag commented 3 months ago

ping