python - 使用别名导入模块

标签 python alias

<分区>

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

创建别名

  import numpy as np

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

  from np import linalg

  ImportError: No module named np.linalg

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

最佳答案

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

导入做两件事:

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

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 中四处寻找来为包创建别名,而不想为所有(可能的)子模块创建别名,因为不这样做可以 cause Python to re-import submodules as separate namespaces .

这种特定情况中,导入numpy 还会触发numpy.linalg 的加载,因此您真正需要做的是:

import numpy as np
# np.linalg now is available

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

import package as alias
import package.submodule

alias.submodule 无论如何都可用,因为子模块总是作为属性添加到父包中。

关于python - 使用别名导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42459939/

相关文章:

intellij-idea - 巴别塔别名。 WebStorm 无法识别子目录

Java Runtime.exec() 不支持 Linux 别名

ruby-on-rails - Ruby(Rails)将属性委托(delegate)给另一个模型的方法?

python - [Python EVE] : Reading the request parameters values in Python EVE

python - tornadoweb 的配置失败 nginx 设置,未知指令 "user"

python - 如何消除文本图像的倾斜并检索该图像的新边界框 Python OpenCV?

c - 这两个指针别名如何?

python - 如何将文本文件中的十六进制行转换为数组(Python)?

python - 如何将 2D numpy 数组的 2D numpy 数组重构为 4D float 组?

git - 我怎样才能使这个 git 命令别名?