pickle
参考文献states that中,可以酸洗的对象集相当有限.事实上,我有一个函数返回一个动态生成的类,我发现我不能pickle该类的实例:
>>> import pickle
>>> def f():
... class A: pass
... return A
...
>>> LocalA = f()
>>> la = LocalA()
>>> with open('testing.pickle', 'wb') as f:
... pickle.dump(la, f, pickle.HIGHEST_PROTOCOL)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: Can't pickle local object 'f.<locals>.A'
这样的物体太复杂了,不可能有pickle
个.好啊现在,神奇的是,如果我try pickle一个类似的对象,但它是派生类的,它会工作!
>>> class DerivedA(LocalA): pass
...
>>> da = DerivedA()
>>> with open('testing.pickle', 'wb') as f:
... pickle.dump(da, f, pickle.HIGHEST_PROTOCOL)
...
>>>
这里发生了什么?如果这很容易,为什么pickle
不使用这个变通方法来实现一个dump
方法,允许对"本地对象"进行pickle?