gpt4 book ai didi

python - 重构模块名称后unpickle实例

转载 作者:行者123 更新时间:2023-12-05 07:48:02 25 4
gpt4 key购买 nike

之前,我在 gselu 包中的模块 gselu.py 中定义了一个 ElectrodePositionsModel 类,并将 ElectrodePositionsModel 对象 pickle 到一些文件中。

一段时间后决定重构项目,包名gselu改为ielu

当我尝试使用 pickle.load() 解开旧的 pickle 文件时,该过程失败并出现错误,“模块”对象没有属性“ElectrodePositionsModel”。我对 Unpickler 行为的理解是,这是因为 pickle 认为它存储了 gselu.gselu.ElectrodePositionsModel 的一个实例,因此尝试从这个模块。当它不存在时,它就会放弃。

我想我应该在模块的 init.py 中添加一些东西来告诉它 gselu.gselu.ElectrodePositionsModel 在哪里,但我无法得到pickle.load() 函数给我除 'module' 之外的任何错误消息没有属性 'ElectrodePositionsModel' 我不知道我应该去哪里提供找到它的正确路径。执行 unpickling 的代码与 ElectrodePositionsModel 类位于同一模块文件 (gselu.py) 中。

当我在 ipython session 中加载 pickle 文件并手动导入 ElectrodePositionsModel 时,它会正确加载。

我如何告诉 pickler 在哪里加载这个模块?

最佳答案

我意识到这个问题很老了,但我刚刚遇到了类似的问题。

我为解决这个问题所做的是采用旧代码并使用它解开数据。然后,我没有直接对自定义类进行 pickle ,而是对仅包含原始 python 的 CustomClass.__dict__ 进行了 pickle 。然后可以通过以下操作轻松地将这些数据导入到新模块中

a = NewNameOfCustomClass()
a.__dict__ = pickle.load('olddata.p', 'rb')

如果您的自定义类只有标准变量(例如内置函数或 numpy 数组等),则此方法有效。

关于python - 重构模块名称后unpickle实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38980862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com