使用别名导入模块

jav*_*dba 4 python alias

当试图import从别名 - 这是常见的scala我很惊讶看到以下结果:

创建别名

  import numpy as np
Run Code Online (Sandbox Code Playgroud)

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

  from np import linalg

  ImportError: No module named np.linalg
Run Code Online (Sandbox Code Playgroud)

python中有任何其他语法/等价物用于导入模块吗?

Mar*_*ers 21

使用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
Run Code Online (Sandbox Code Playgroud)

请注意,在这种特定情况下,导入sys.modules也会触发加载numpy,因此您所要做的就是:

import numpy as np
# np.linalg now is available
Run Code Online (Sandbox Code Playgroud)

不需要模块别名.对于不自动导入子模块的软件包,您必须使用:

import package as alias
import package.submodule
Run Code Online (Sandbox Code Playgroud)

并且numpy.linalg随后可无论如何,因为子模块始终作为对父包的属性.

  • 说它“不创建别名”有点夸张。它确实创建了一个别名。但是它为其创建别名的是模块对象,而不是导入路径(因此您不能从中导入)。 (2认同)