加载 pickle 会导入对象的模块吗?
Does loading a pickle import the object's module?
我的印象是从 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
这是怎么回事?
Pickle 导入模块。只是不要进入那个名字 space。 'numpy' in sys.modules
在 pickle.load
调用前为假,在调用后为真。
is it correct to say that there is no namespace into which numpy is imported?
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
。
我的印象是从 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
这是怎么回事?
Pickle 导入模块。只是不要进入那个名字 space。 'numpy' in sys.modules
在 pickle.load
调用前为假,在调用后为真。
is it correct to say that there is no namespace into which numpy is imported?
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
。