2016-12-01 35 views
1

重命名模块后,通过numpy.load加载对象时出现问题。 下面是一个显示问题的简单例子。重命名模块后取下对象

想象一下,在mymodule.py定义的类:从蟒蛇会话

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

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

我可以简单地创建一个实例,并将其保存:

import numpy as np 
import mymodule 

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

加载文件很好地工作(甚至从一个新鲜会话开始在同一个文件夹中):

np.load("dump.npy") 

如果我现在重命名为mo dule:

mv mymodule.py mymodule2.py 

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

import mymodule2 as mymodule 

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

还有什么我可以做的避免符号链接解决方案吗?并避免将来出现同样的问题?

非常感谢, 马尔科 [这是我的第一个问题在这里,很抱歉,如果我做错了什么]对于对象的数组

回答

0

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())