酸洗数据类的实例

时间:2020-12-20 16:22:44

标签: python python-dataclasses

是否有可能按如下方式腌制/莳萝 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

2 个答案:

答案 0 :(得分:1)

我发现这在 pickle 中不受支持,这可能也意味着 dillPython bug tracker Issue35510 :pickling derived dataclasses

<块引用>

数据类按名称以及其他类进行腌制。不支持无法通过名称访问的酸洗类。 - Serhiy Storchaka (2018-12-16)

另请参阅此处了解有关 dill 的更多详细信息。 github dill issue tracker

答案 1 :(得分:1)

Thx @Tom Myddeltyn 用于 Issue35510 错误跟踪器。 dill.dumpdill.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'))
相关问题