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

ris*_*hai 2 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]: numpy
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-13-8d40275025d1> in <module>
----> 1 numpy

NameError: name 'numpy' is not defined
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

Dan*_* D. 5

Pickle 导入模块。只是没有进入那个名称空间。调用'numpy' in sys.modules前为假,pickle.load调用后为真。

说没有导入 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
Run Code Online (Sandbox Code Playgroud)

在此方法期间,这些名称所在的模块在此函数的范围内module被绑定mod