- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 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/
如何在 Python 中添加对pickling传统上不可pickablable类型的支持? 我有一个需要 pickle 的复杂对象,它包含对 NotImplementedType 类的引用。该类是第三
我在检查内置类型 NotImplementedType 时注意到一些奇怪的事情。 >>> from types import NotImplementedType >>> issubclass(Not
我正在使用 Keras 进行深跑。但是在学习后存储模型的过程中出现如下错误。 TypeError: can't pickle NotImplementedType objects 当我在另一个目录中运
我是一名优秀的程序员,十分优秀!