我认为您没有仔细阅读您引用的参考文献。该参考文献还明确指出只有以下对象是可腌制的:
- 在模块顶层定义的函数(使用def,而不是> lambda)
- 在模块顶层定义的内置函数
- 在 模块顶层* 定义的类 *
你的例子
>>> def f():... class A: pass... return A
在模块的顶部电平不定义类,它定义了一个内类 范围 的
f()。
pickle适用于 全局类 ,而不是局部类。这将自动使可腌制测试失败。
DerivedA是一个全球课程,所以一切都很好。
至于为什么只有顶级(对您来说是全局的)类和函数不能被腌制,参考文献也回答了这个问题(黑体字):
请注意,函数(内置的和用户定义的)是通过 “完全限定”的名称引用
而不是值进行酸洗的。这意味着仅对函数名称以及在其中定义该函数的模块的名称进行腌制。 既不腌制函数的代码,也不腌制其任何函数属性
。因此,定义模块必须在解酸环境中是可导入的,并且该模块必须包含命名对象,否则将引发异常。同样,通过命名引用对类进行酸洗,因此在未酸洗环境中也适用相同的限制。
所以你有它。
pickle仅按名称引用而不是对象中包含的原始指令序列化对象。这是因为
pickle's工作是序列化 对象层次结构 ,而没有别的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)