【发布时间】:2022-12-22 02:17:58
【问题描述】:
我有一个相当简单的数据类。
把它放在泡菜上(用莳萝代替真正的泡菜)。
import dill as pickle
经过一些其他操作:
- 加载相同的 pickle 失败
- 尝试保存同一对象失败
错误:
TypeError: cannot pickle '_hashlib.HASH' object
我没有使用任何 hashlib 库(我知道)。
以前我能够毫无问题地腌制/取消腌制同一个对象/数据类。
【问题讨论】:
我有一个相当简单的数据类。
把它放在泡菜上(用莳萝代替真正的泡菜)。
import dill as pickle
经过一些其他操作:
错误:
TypeError: cannot pickle '_hashlib.HASH' object
我没有使用任何 hashlib 库(我知道)。
以前我能够毫无问题地腌制/取消腌制同一个对象/数据类。
【问题讨论】:
这很愚蠢,但很难弄清楚。
问题是我用对象(数据类)的定义重新加载了模块。在那之后,pickle/dill 没有按预期工作(正如不太了解 pickle 工作原理的天真头脑所期望的那样)。
如here所述,重新加载是为了开发,有一些副作用。
如果您需要使用 pickle 和 reload,宁愿重启内核并重新开始。
如果您真的需要一种按值而不是按引用进行腌制的方法,请尝试cloudpickle(尚未使用)。
cloudpickle 和 pickle 的一个重要区别是 cloudpickle 可以按值序列化函数或类,而 pickle 只能通过引用序列化它。
【讨论】: