gpt4 book ai didi

python - 如何pickle NotImplementedType

转载 作者:行者123 更新时间:2023-11-30 22:31:22 30 4
gpt4 key购买 nike

如何在 Python 中添加对pickling传统上不可pickablable类型的支持?

我有一个需要 pickle 的复杂对象,它包含对 NotImplementedType 类的引用。该类是第三方的,因此我无法重写其 __copy__()__deepcopy__()__getstate__() 方法。

我不完全确定为什么 Pickle 无法序列化 NotImplementedType。我确信有一些愚蠢的教条原因,但我不在乎。事实上,这个类永远不会改变,也不包含任何状态,所以它应该是可序列化的。果然,dill package可以很好地序列化这个类。

所以我尝试实现自定义 copy_reg使用 dill 的 NotImplementedType 处理程序如下:

copy_reg.pickle(NotImplementedType,
lambda code: (dill.loads, (dill.dumps(code),)),
dill.loads)

但是,尝试深度复制我的对象会引发异常:

'NoneType' object has no attribute 'update'

来自 /usr/lib/python2.7/copy.py 中的第 347 行。深入研究此代码表明 copy_reg/deepcopy/pickle 模块期望序列化和反序列化实例,而不是对类的引用,并且它抛出此异常是因为它试图实例化 NotImplementedType 而不是仅仅查找类引用。有什么解决办法吗?

最佳答案

相关类实际上不太可能包含 NotImplementedType;相反,它可能正在 pickle NotImplemented,并且 NotImplemented 的归约函数正在尝试根据其类型对其进行 pickle ,但 NotImplementedType 不是。 t 直接暴露(您只能通过 type(NotImplemented) 获取它),因此尝试创建可以找到 NotImplementedType 的限定名称会失败。这个问题在 Python 3 中得到了修复(移动的另一个参数),但在 Python 2 中修复起来看起来也相当简单,因为为 NotImplementedType 定义一个正常的 copy_reg 处理程序将确保NotImplemented 在不引用其自身类型的情况下进行 pickle 。

最简单的方法是让你的reducer函数返回命名为NotImplemented的字符串,然后在unpickle时将其作为全局变量进行查找。方便的是,这意味着您不需要定义任何辅助方法(在 unpickling 端可能不存在):

copy_reg.pickle(type(NotImplemented), lambda obj: 'NotImplemented')

您根本没有定义构造函数(第三个 copy_reg.pickle 参数); pickle 将包含重新创建 NotImplemented 所需的所有信息,而不依赖于 unpickling 端,无需尝试序列化 NotImplementedType 即可恢复 NotImplemented

关于python - 如何pickle NotImplementedType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45826043/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com