遍历对象层次结构pickle风格



我需要在pickle发生之前对被pickle的对象进行某种处理。更准确地说,对于某个基类的子类的实例,我希望完全不同的东西被pickle,然后在加载时重新创建。

我知道__getstate__ &__setstate__是一种侵入性很强的方法。我的理解是,这些都是私有方法(以双下划线开头:__),因此受到名称混淆的影响。因此,这将有效地迫使我为每个我想要服从这种非标准行为的类重新定义这两个方法。另外,我并不能完全控制所有类的层次结构。

我想知道是否有某种简单的方法可以连接到酸洗过程中,并应用__getstate____setstate__给出的这种控制,但不必修改这样的酸洗类。

给好奇的人的边注。这是一个使用Django和芹菜的项目用例。Django模型要么是不可选择的,要么是非常不实用且难于pickle的。因此,更明智的做法是pickle值对ID + model class。然而,有时不是模型直接被pickle而是模型的字典,模型的列表,模型列表的列表,你能想到的。这迫使我编写了许多我非常不喜欢的复制粘贴代码。pickle模型的需求本身来自django -芹菜设置,其中函数及其调用参数被安排在稍后执行。不幸的是,在这些争论中,通常有许多模型混合在一些重要的层次结构中。

编辑

我确实有可能指定一个自定义序列化器由芹菜使用,所以这真的是一个问题,能够构建一个稍微修改的序列化器在pickle之上,而不需要太多的努力。

唯一相关的额外钩子是reduce()和__reduce__ex()

http://docs.python.org/library/pickle.html

__reduce__和__reduce_ex__的区别是什么?

Python:确保我的类只使用最新的协议进行pickle

不确定他们是否真的提供你特别需要的

最新更新