python - 重命名模块后 Unpickling 对象

标签 python numpy pickle

我在重命名模块后通过 numpy.load 加载对象时遇到问题。 这是一个显示问题的简单示例。

假设在 mymodule.py 中定义了一个类:

class MyClass(object):
    a = "ciao"
    b = [1, 2, 3]

    def __init__(self, value=2):
        self.value = value

从 python session 我可以简单地创建一个实例并保存它:

import numpy as np
import mymodule

instance = mymodule.MyClass()
np.save("dump.npy", instance)

加载文件效果很好(即使是从同一文件夹中启动的新 session ):

np.load("dump.npy")

如果我现在重命名模块:

mv mymodule.py mymodule2.py

加载失败。这是预料之中的,但我希望通过在加载之前导入模块:

import mymodule2 as mymodule

可以找到对象定义......但它不起作用。 这意味着: 1.我不明白它是如何工作的 2. 我被迫在我正在部分重构的项目中保留指向重命名文件的符号链接(symbolic link)。

还有什么我可以做的来避免符号链接(symbolic link)解决方案吗?并避免将来遇到同样的问题?

非常感谢, 马可 [这是我的第一个问题,如果我做错了什么,抱歉]

最佳答案

NumPy uses pickle对于带有对象的数组,但在其顶部添加一个标题。因此,您需要做的不仅仅是编写自定义 Unpickler 代码。 :

import pickle

from numpy.lib.format import read_magic, _check_version, _read_array_header


class RenamingUnpickler(pickle.Unpickler):
    def find_class(self, module, name):
        if module == 'mymodule':
            module = 'mymodule2'
        return super().find_class(module, name)


with open('dump.npy', 'rb') as fp:
    version = read_magic(fp)
    _check_version(version)
    dtype = _read_array_header(fp, version)[2]
    assert dtype.hasobject
    print(RenamingUnpickler(fp).load())

关于python - 重命名模块后 Unpickling 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40914066/

相关文章:

python - django 中特定页面失去身份验证

python - 在 python 中出现几个回溯错误

python - 如何对 2D numpy 数组求平方或求幂(按元素)?

python - 检查pickle文件的pickle协议(protocol)

python - Tkinter:确定小部件相对于根窗口的位置

python3 + Pandas 样式 + 更改交替行颜色

python - 通过 Drive API 在国际设置中创建具有设定区域设置的云端硬盘文件

python - 统一随机数

python - pickle 转储 Pandas DataFrame

java - 将 JSON 从 Python 发送到 Java