pickle
参照states thatピクルすることができるオブジェクトのセットは、かなり限定されている。確かに、私はdinamically-生成されたクラスを返す関数を持っている、と私はそのクラスのインスタンスを酸洗いすることはできませんが見つかりました:派生クラスを使用すると、私は "ローカルオブジェクトを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
のためにあまりにも複雑です。 OK。さて、魔法は、似たようなオブジェクトをピクルしようとすると、派生したクラスのピクルを試みると動作します。
>>> class DerivedA(LocalA): pass
...
>>> da = DerivedA()
>>> with open('testing.pickle', 'wb') as f:
... pickle.dump(da, f, pickle.HIGHEST_PROTOCOL)
...
>>>
ここで何が起こっているのですか?これが簡単なのであれば、pickle
は、この回避策を使用してdump
メソッドを実装して「ローカルオブジェクト」をピックすることができないのはなぜですか?
いいえ、クラスの名前だけがピクルされます。クラスそのものが(何らかの形で)保存されたと思っていましたが、これは基本クラスを節約することを意味しますが、これはpickleableではありません。 – fonini
ところで、無関係なクラスがありますが同じ名前の環境で私はそれをアンピクルすると、この無関係なクラスのフランクシュタインのモンスターオブジェクトを得るでしょうが、古いクラスの属性を持っていますか?私はそれが沸騰すると思う:漬け物は私が思ったように自己完結型ではありません。 – fonini
@foniniまた、リファレンスから: "...クラスインスタンスがピクルされると、クラスのコードとデータは一緒にピクルされません。インスタンスデータのみがピクルされます。"そう、正しい動作のように聞こえます。 :) –