使用别名导入模块

Import modules using an alias

尝试从别名 import 时 - 这在 scala 中很常见,我很惊讶地看到以下结果:

创建别名

  import numpy as np

使用别名导入它包含的模块

  from np import linalg

  ImportError: No module named np.linalg

python 中还有其他 syntax/equivalent 对导入模块有用吗?

使用 import module as name 不会 创建别名。你误解了导入系统。

导入做两件事:

  1. 将模块加载到内存中并将结果存储在sys.modules中。这仅完成 一次;随后的导入重新使用已经加载的模块对象。
  2. 在您当前的命名空间中绑定一个或多个名称。

as name 语法可让您在最后一步控制名称。

对于 from module import name 语法,您仍然需要命名完整的模块,因为 module 是在 sys.modules 中查找的。如果你真的想要一个别名,你必须在那里添加额外的引用:

import numpy  # loads sys.modules['numpy']
import sys

sys.modules['np'] = numpy  # creates another reference

但是,当您同时导入子模块时,这样做可能会产生副作用。一般来说,您不想通过在 sys.modules 中四处寻找来为包创建别名,而不想为所有(可能的)子模块创建别名,因为不这样做可以 .

这个具体案例中,导入numpy也会触发numpy.linalg的加载,所以你真正需要做的是:

import numpy as np
# np.linalg now is available

不需要模块别名。对于不自动导入子模块的包,你必须使用:

import package as alias
import package.submodule

并且 alias.submodule 仍然可用,因为子模块总是作为属性添加到父包中。

我对你的例子的理解是,既然你已经导入了 numpy,你就不能用别名重新导入它,因为它已经导入了 linalg 部分。