Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.3k
Closed
Description
Repro:
## Setup>>>importpickle>>>importdataclasses>>>A=dataclasses.make_dataclass('A', [])>>>@dataclasses.dataclass...classB:pass...## Correct>>>pickle.loads(pickle.dumps(B))<class'__main__.B'>>>>pickle.loads(pickle.dumps(B()))B()## Wrong>>>pickle.load(pickle.dump(A))Traceback (mostrecentcalllast):File"<stdin>",line1,in<module>_pickle.PicklingError:Can't pickle <class 'types.A'>:attributelookupAontypesfailed>>>pickle.loads(pickle.dumps(A()))Traceback (mostrecentcalllast):File"<stdin>",line1,in<module>_pickle.PicklingError:Can't pickle <class 'types.A'>:attributelookupAontypesfailed
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 inmake_dataclass.
I have a simple PR ready, it is inspired bynamedtuple's logic :)