【发布时间】:2012-04-19 15:54:49
【问题描述】:
在 python 中,是否可以在转换为新样式后取消腌制为旧样式 python 类的对象? (即,具有不同“类签名”的对象)。 *
例如,假设某些实例被保存为:
class foo: # old style
然后在类更改为从对象继承后,又腌制了一些对象:
class foo(object): # new style
带有一个pickle.dump'ed 的对象可以被同一样式类pickle.load'ed,但两者都不会加载。我认为pickle使用的策略会根据继承发生变化(从对象继承的类有一个自动定义的 __reduce__ 方法,但没有继承的类没有)。当试图从没有继承(旧式定义)的代码中加载带有继承的旧式泡菜时,我得到了与SO question 中看到的相同的参数错误;即使第二个参数是多余的,它仍然会更改“类签名”和预期参数,并阻止加载。为了解决这个问题,我很乐意编写一个 unpickler,尽管我担心它可能涉及两个单独的子类 unpickler a la the docs...如果我知道如何正确解开每个我会很好的.
关于我的情况的一点背景...我正在使用 TrialHandler 类来保存和重新加载按钮按下和反应时间以进行行为心理学实验。我们重构了 TrialHandler 类以从更抽象的 baseTrialHandler 继承,但这样做暂时将类签名更改为从 object 继承。但是,我们无法解开旧的 trial_handler 文件,所以它被改回来了。我想查看使用两个版本的试验处理程序运行的同一个实验的数据,因此想在同一个脚本中取消两种类型的已保存日志文件。
或者,如果我不能编写一个自定义 unpickler 来解开两个对象,是否有另一种方法来序列化它们?我尝试直接转储到 yaml,但看起来我必须将类注册为可以被 yaml 化的东西,无论如何。
PsychoPy 邮件列表中包含有特定错误的完整 description of the problem。任何解释中间酸洗细节甚至python继承的博客文章都将受到欢迎;我找到的最接近的是一个很好的解释,为什么pickling is insecure 将酸洗描述为“简单的基于堆栈的虚拟机”,这很好,但并不足以让我弄清楚我自己拆开的基本知识。
【问题讨论】:
标签: python inheritance pickle