Python 加载pickle是否导入对象';s模块?
我的印象是,从pickle加载对象(不是内置类型)将导入模块。例如 指示与要取消勾选的对象类型对应的模块必须存在于同一路径中 但是,当我尝试取消勾选NumPy ndarray时,取消勾选工作正常,但模块似乎没有导入:Python 加载pickle是否导入对象';s模块?,python,pickle,Python,Pickle,我的印象是,从pickle加载对象(不是内置类型)将导入模块。例如 指示与要取消勾选的对象类型对应的模块必须存在于同一路径中 但是,当我尝试取消勾选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]:
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
[12]中的:以open('numpysample.pkl','rb')作为输入:
…:a=pickle.load(输入)
In[14]:类型(a)
Out[14]:numpy.ndarray
在[13]中:numpy
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在里面
---->1努比
NameError:未定义名称“numpy”
这是怎么回事?Pickle导入模块。只是不要进入那个名字空间<系统模块中的code>'numpy'在调用pickle.load之前为false,之后为true 说不存在要导入numpy的名称空间是正确的吗
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
中的模块名称绑定到mod
。注意,import numpy
加载pickle后将非常快地执行;它实际上不再导入numpy
,它只是从sys.modules
获取缓存的导入;我试过sys.modules
,果然如你所说。我理解pickle导入numpy
,但是说没有导入numpy
的名称空间是正确的吗?我这样说是因为没有名称绑定到模块(仅在sys.modules
dict中作为值引用)。由于\uuuu import\uuuu()
不绑定要加载的模块的名称,并且从外部无法访问mod
,因此我们无法使用名称直接引用未点击对象的类/模块。但我想我们也可以从dir()
或globals()
中了解到这一点。