2016-12-01 80 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())