2012-03-20 76 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類實例加載到B類中。在這種情況下,B類的__setstate__方法嘗試設置self.foo。這個結果是__settattr__方法調用,它檢查self.a_instanceattr屬性。但是,A類不是未拆開的,所以self.known_names不存在。因此,將A的__getattr__稱爲無限遞歸(因爲known_names不存在,所以它也調用__getattr__)。

+3

http://docs.python.org/library/pickle.html#subclassing-unpicklers – Amber 2012-03-20 08:12:00

回答

0

這不是一個依賴關係問題本身,因爲當取消對象時通常不會調用__init__

正如Python pickle docsthis ticket您的問題描述是最有可能的是A不能安全拆封由於使用的__getattr__

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)