重命名模块

时间:2016-12-01 15:10:21

标签: 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会话中我可以简单地创建一个实例并保存它:

import numpy as np
import mymodule

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

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

np.load("dump.npy")

如果我现在重命名模块:

mv mymodule.py mymodule2.py

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

import mymodule2 as mymodule

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

我还能做些什么来避免使用符号链接解决方案吗?并避免将来出现同样的问题?

非常感谢, 马尔科 [这是我在这里的第一个问题,对不起,如果我做错了的话)

1 个答案:

答案 0 :(得分:3)

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())
相关问题