当前位置: 首页 > 面试题库 >

使用别名导入模块

楚硕
2023-03-14
问题内容

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

创建一个别名

  import numpy as np

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

  from np import linalg

  ImportError: No module named np.linalg

python中是否还有其他语法/等效项可用于导入模块?


问题答案:

使用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不为所有(可能的)子模块创建别名的情况下通过拨入来为包创建别名,否则可能会导致Python将子模块重新导入为单独的命名空间。

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

import numpy as np
# np.linalg now is available

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

import package as alias
import package.submodule

alias.submodule始终可用,因为子模块始终作为属性添加到父包中。



 类似资料:
  • 问题内容: 在Java中是否可以导入软件包并为该软件包导入一个特定的名称? 我目前有一个类,它使用来自后端的一些DTO和服务包。在这两个软件包中,DTO的名称相同。我认为这不太可读: 这是一个小例子。该类实际上非常复杂,并且其中包含更多代码。 Java是否有类似的东西,以便我可以缩短源代码? 问题答案: 不,您不能“将x导入为y”;在Java中。 您可以做的是扩展该类,或为其编写包装类,然后导入该

  • 问题内容: 我已尝试找到有关最佳使用还是全面的指南。我刚开始使用Python,并且正在尝试着眼于最佳实践。 基本上,我希望有人能分享他们的经验,其他开发人员有什么喜好,以及避免遇到麻烦的最佳方法是什么? 问题答案: 和之间的区别主要是主观的。选择最喜欢的一个,并在使用中保持一致。这里有一些要点可以帮助你做出决定。 优点: - 减少维护你的import报表。无需添加任何其他导入即可开始使用模块中的另

  • 问题内容: 哪种风格更好? 风格A: 风格B: 假设 在代码的其他地方没有使用,仅在此函数内部使用。 问题答案: 确实,如前所述,通常最好遵循PEP 8的建议,并在顶部进行导入。虽然有一些例外。理解它们的关键在于您在第二段中嵌入的问题:“导入在哪个阶段发生?” 导入实际上是一个可执行语句。导入模块时,模块中的所有可执行语句都会运行。“ def”也是可执行的语句;它的执行将使定义的名称与(已编译的)

  • 问题 将代码组织成包,想用import语句从另一个包名没有硬编码过的包中导入子模块。 解决方案 使用包的相对导入,使一个模块导入同一个包的另一个模块 举个例子,假设在你的文件系统上有mypackage包,组织如下: mypackage/ __init__.py A/ __init__.py spam.py grok.py B/

  • 问题内容: 我正在尝试使用该函数进行复制,但似乎遇到了麻烦。 一个简单的例子很简单: 我遇到的问题是我正在从子包中导入名称(即): 所以我想要的是 但这只是导入了顶级包,而不是子包: 问题答案: 该函数将返回包的顶级模块,除非您传递了非空参数: 请参阅该函数的Python文档。

  • 问题内容: 我正在尝试从其他目录动态导入模块。我正在从这个问题中得到答案。我在名为foo的目录中有一个名为bar的模块。主脚本将在foo的父目录中运行。 这是我到目前为止在测试脚本中拥有的代码(正在foo的父目录中运行) 和bar.py的代码 但是当我运行test.py时,出现此错误: 问题答案: 需要导入模块的路径名+文件名,您应该将源代码更改为以下代码之一: