私はPythonのpickleファイルを持っていますが、ロードしようとすると特定のオブジェクトを別のオブジェクトの前にロードしたいと思っています。Python pickleでのオブジェクトのロード順序
これは可能ですか?ここで
はシナリオです:
class A:
def __init__(self):
self.known_names = ["Dan", "David"]
def __getattr__(self, name):
if name not in self.known_names:
raise UnknownName
else:
return self[name]
class B:
def __init__(self):
self.a_instance = A()
def __setattr__(self, name, value):
if self.a_instance.attr == "something":
do_something...
def __setstate__(self):
self.foo = "blah"
ピクルスファイルをロードするときに問題が発生しました。クラスBインスタンスがbeofeクラスAにロードされる。このシナリオでは、クラスBの__setstate__
メソッドはself.foo
を設定しようとする。この結果、__settattr__
メソッド呼び出しでself.a_instance
のattr
属性がチェックされます。しかし、クラスAはまだunpickledされていないので、self.known_names
は存在しません。 Aの__getattr__
を呼び出すと、無限の再帰が発生します(known_names
は存在しないため、__getattr__
も呼び出します)。
http://docs.python.org/library/pickle.html#subclassing-unpicklers – Amber