2012-03-20 123 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)