【问题标题】:Load order of objects in Python picklePython pickle 中对象的加载顺序
【发布时间】:2012-03-20 08:07:00
【问题描述】:

我有一个 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"

加载pickle文件时出现问题。 B 类实例在 A 类之前加载。在​​这种情况下,B 类的__setstate__ 方法尝试设置self.foo。这导致__settattr__ 方法调用检查self.a_instanceattr 属性。但是,A 类尚未解封,因此 self.known_names 不存在。所以调用 A 的 __getattr__ 会导致无限递归(因为 known_names 不存在,它也会调用 __getattr__)。

【问题讨论】:

标签: python pickle


【解决方案1】:

这本身不是一个依赖问题,因为通常__init__ 不会在 unpickling 对象时被调用。

正如Python pickle docsthis ticket 中所述,您的问题很可能是由于使用了__getattr__A 无法安全解压。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多