使用包的别名时,为什么从包导入无效?


问题内容

为了更加清楚,请考虑一个numpy示例:

import numpy as np
from numpy import array

这按预期工作。但是呢:

from np import array

输出为:

Traceback (most recent call last)
  <ipython-input-21-d5c81fa93e5f> in <module>()
    ----> 1 from np import array
ModuleNotFoundError: No module named 'np'

一旦将导入的模块numpy的别名设置为np,我是否应该仅使用np导入其他内容?

此外,id()这两个是一样的-既numpynp指同样的事情。


问题答案:

numpy即使将模块导入为,模块名称仍然是np

什么import … as …语法基本上做到这一点是:

np = internal_import_module('numpy')

因此,np只是用来引用numpy模块的本地名称。如果查看的模块名称np,您会发现它仍然是'numpy'

>>> import numpy as np
>>> np.__name__
'numpy'

现在,在评估另一个导入语句时,根本不使用模块的本地名称。所以您from numpy import array基本上就是这样:

array = internal_import_module('numpy').array

array再次这里只是模块array内部成员的本地名称numpy。但是,它不是np模块内部的成员,因为根本就没有该名称的模块。