python - Pickle:处理更新的类定义

标签 python pickle recompile hotswap

通过重新编译脚本更新类定义后,pickle 拒绝序列化该类先前实例化的对象,并给出错误:“无法 pickle 对象:它与对象不同”

有没有办法告诉 pickle 它应该忽略这种情况?要仅按名称识别类,忽略导致不匹配的内部唯一 ID?

我绝对欢迎以方便和稳健的方式解决此问题的替代等效模块的建议作为答案。


作为引用,这是我的动机:

我正在创建一个高生产力、快速迭代的开发环境,在其中实时编辑 Python 脚本。脚本被反复重新编译,但数据在编译过程中仍然存在。作为生产力目标的一部分,我正在尝试使用 pickle 进行序列化,以避免为不断变化的数据结构编写和更新显式序列化代码的成本。

我主要序列化内置类型。我小心翼翼地避免对我 pickle 的类进行有意义的更改,并在必要时使用 copy_reg.pickle 机制对 unpickle 执行上转换。

脚本重新编译完全阻止我 pickle 对象,即使类定义实际上没有改变(或者只是以良性方式改变)。

最佳答案

除非您可以解压早期版本的类定义,否则需要转储和加载实例的引用 pickle 现在已经不存在了。所以这是“不可能的”。

但是,如果您确实想这样做,您可以保存您的类定义的以前版本...然后您就必须欺骗 pickle 来引用您的类定义旧的/保存的类定义,而不是使用最新的——这可能只是编辑 obj.__class__obj.__module__ 以指向您的旧类。您的类实例中可能还有一些其他奇怪的事情也引用了您必须处理的旧类定义。此外,如果您添加或删除类方法,您可能会遇到一些意想不到的结果,或者必须相应地处理更新实例。另一个有趣的变化是,您可以让 unpickler 始终使用您的类的最新版本。

我的序列化包,dill , 有一些方法可以将编译后的源代码从实时代码对象转储到临时文件,然后使用该临时文件进行序列化。它是软件包中较新的部分之一,因此不如 dill 的其余部分强大。此外,您的用例不是我考虑过的用例,但我可以看出拥有它会是一个不错的功能。

关于python - Pickle:处理更新的类定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16269071/

相关文章:

python - 仅当模式不在转义字符串内时,re.match才返回匹配对象

python - sklearn将模型保存到磁盘,但只获取数组

java - 如何修改smali代码删除java代码中的1行

sql-server - SqlServer - 选项重新编译并行执行行为

python - 使用 Mechanize 和 python 处理 USPTO 网站

python - 创建新的 pandas 行,作为来自不同行的文本值组合的结果,这些文本值在其他 pandas 列中具有相同的值

python - Seaborn regplot 拟合线与 stats.linregress 或 stats 模型的计算拟合不匹配

python - 无法使用 pickle Python 写入二进制文件

python - 使用来自非 python 的 pickle 二进制格式(使用 celery 和 rabbitmq)

java - 如何在java netbeans中使用-Xlint重新编译?