2012-03-20 10 views
0

私は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_instanceattr属性がチェックされます。しかし、クラスAはまだunpickledされていないので、self.known_namesは存在しません。 Aの__getattr__を呼び出すと、無限の再帰が発生します(known_namesは存在しないため、__getattr__も呼び出します)。

+3

http://docs.python.org/library/pickle.html#subclassing-unpicklers – Amber

答えて

0

これは依存性の問題ではありません。通常、オブジェクトをアンピクルするときには__init__は呼び出されません。 Python pickle docsthis ticketあなたの問題で説明したように

が原因__getattr__の使用にAが安全にunpickleすることができない可能性が最も高いです。

A__getstate____setstate__を実装することは十分かもしれません:

def __getstate__(self): 
    """Extract state to pickle.""" 
    return self.__dict__ 

def __setstate__(self, d): 
    """Restore from pickled state.""" 
    self.__dict__.update(d) 
関連する問題