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