加载泡菜会导入对象的模块吗?

时间:2019-12-03 01:40:31

标签: python pickle

我的印象是,从泡菜中加载对象(不是内置类型之一)会导入模块。例如, pickle can't import a module that exists?表示与未选择对象类型相对应的模块必须存在于同一路径中。

但是,当我尝试解开NumPy ndarray时,解开工作正常,但是似乎未导入该模块:

In [12]: with open('numpysample.pkl', 'rb') as input:
    ...:     a = pickle.load(input)

In [14]: type(a)
Out[14]: numpy.ndarray

In [13]: numpy
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-13-8d40275025d1> in <module>
----> 1 numpy

NameError: name 'numpy' is not defined

这是怎么回事?

1 个答案:

答案 0 :(得分:4)

Pickle导入模块。只是不进入该名称空间。 .modalPresentationStyle在调用'numpy' in sys.modules之前为false,在调用之后为true。

  

说没有将numpy导入的名称空间是否正确?

pickle.load的来源应该回答这个问题。

pickle.Unpickler.find_class

在此方法范围内,使用此方法的模块在 def find_class(self, module, name): # Subclasses may override this __import__(module) mod = sys.modules[module] klass = getattr(mod, name) return klass 中的名称已绑定到module