重命名模块后,我在通过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.我被迫在我正在重构的项目中保留了重命名文件的符号链接。
我还能做些什么来避免使用符号链接解决方案吗?并避免将来出现同样的问题?
非常感谢, 马尔科 [这是我在这里的第一个问题,对不起,如果我做错了的话)
答案 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())