问题描述
是否有可能按如下方式腌制/莳萝 an_instance
?
import dill
import pandas as pd
import numpy as np
from datetime import datetime,timezone
from dataclasses import make_dataclass,field
fields = [('float_val',float,field(default=np.nan)),('df',pd.DataFrame,field(default_factory=pd.DataFrame)),('int_val',int,field(default_factory=int)),('time_val',datetime,field(default=datetime.Now(timezone.utc)))]
Aclass = make_dataclass('Aclass',fields)
an_instance=Aclass()
dill.dump(an_instance,open('test.pkl','wb'))
转储给出 PicklingError: Can't pickle <class 'types.Aclass'>: it's not found as types.Aclass
解决方法
我发现这在 pickle
中不受支持,这可能也意味着 dill
。
Python bug tracker Issue35510 :pickling derived dataclasses
数据类按名称以及其他类进行腌制。不支持无法通过名称访问的酸洗类。 - Serhiy Storchaka (2018-12-16)
另请参阅此处了解有关 dill
的更多详细信息。
github dill issue tracker
Thx @Tom Myddeltyn 用于 Issue35510 错误跟踪器。 dill.dump
和 dill.load
的工作原理是使用 Aclass.__module__ = __name__
设置名称。
完整代码如下:
fields = [('float_val',float,field(default=np.nan)),('df',pd.DataFrame,field(default_factory=pd.DataFrame)),('int_val',int,field(default_factory=int)),('time_val',datetime,field(default=datetime.now(timezone.utc)))]
Aclass = make_dataclass('Aclass',fields)
Aclass.__module__ = __name__ # provide name for pickling the class
an_instance=Aclass()
dill.dump(an_instance,open('test.pkl','wb'))
dill.load(open('test.pkl','rb'))