重命名模块后取消对象



我在重命名模块后通过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

可以找到对象定义...但是它不起作用。这意味着: 1.我不明白它是如何工作的 2.我被迫将符号链接保留在我部分重构的项目中。

我还有什么可以做的事情避免符号链接解决方案吗?并避免将来遇到相同的问题?

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

numpy使用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())

最新更新