Repro:
## Setup >>> import pickle >>> import dataclasses >>> A = dataclasses.make_dataclass('A', []) >>> @dataclasses.dataclass ... class B: pass ... ## Correct >>> pickle.loads(pickle.dumps(B)) <class '__main__.B'> >>> pickle.loads(pickle.dumps(B())) B() ## Wrong >>> pickle.load(pickle.dump(A)) Traceback (most recent call last): File "<stdin>", line 1, in <module> _pickle.PicklingError: Can't pickle <class 'types.A'>: attribute lookup A on types failed >>> pickle.loads(pickle.dumps(A())) Traceback (most recent call last): File "<stdin>", line 1, in <module> _pickle.PicklingError: Can't pickle <class 'types.A'>: attribute lookup A on types failed
I think that this happens because of this:
>>> A.__module__ 'types' >>> B.__module__ '__main__'
After a manual fix it works as it should:
>>> A.__module__ = '__main__' >>> pickle.loads(pickle.dumps(A())) A()
So, I propose to do it for all dataclasses that we create in make_dataclass.
I have a simple PR ready, it is inspired by namedtuple's logic :)
pythongh-102103: add `module` argument to `dataclasses.make_dataclass`
@Fatal1ty great timing, happy to help! 🙂
gh-102103: add `module` argument to `dataclasses.make_dataclass` (#10…
pythongh-102103: add `module` argument to `dataclasses.make_dataclass` (
Funny timing. I just ran into this bug myself yesterday.
Activity
pythongh-102103: add `module` argument to `dataclasses.make_dataclass`
sobolevn commented on Feb 21, 2023
@Fatal1ty great timing, happy to help! 🙂
gh-102103: add `module` argument to `dataclasses.make_dataclass` (#10…
pythongh-102103: add `module` argument to `dataclasses.make_dataclass` (
endlisnis commented on Mar 18, 2023
Funny timing. I just ran into this bug myself yesterday.