首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么有些Python子模块不能自动导入?

为什么有些Python子模块不能自动导入?
EN

Stack Overflow用户
提问于 2020-03-17 11:48:40
回答 1查看 33关注 0票数 1

我正在尝试使用IBM的Qiskit,这是一个用于量子计算电路设计和仿真的Python库。

特别是,我需要使用子模块qiskit.aqua.components.oracle,它是qiskit.aqua.components的一个子模块。然而,当我尝试

代码语言:javascript
运行
复制
import qiskit.aqua.components

只导入qiskit.aqua.components中的一些子模块,而不是所有的子模块。

我必须手动导入qiskit.aqua.components.oracle

如果我快速浏览一下源代码(https://github.com/Qiskit/qiskit-aqua/tree/master/qiskit/aqua),我看不出有任何特殊的原因会出现这种情况。有人能帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2021-02-07 05:35:29

当您导入(子)模块时,模块本身决定它公开哪些成员。更进一步的子模块不会自动包括在内。在您的示例中,导入qiskit.aqua.componentscomponents模块通过其__init__.py决定它公开的成员。下面是一个示例结构:

代码语言:javascript
运行
复制
qiskit/
├── aqua
│   ├── components
│   │   ├── __init__.py
│   │   └── oracles
│   │       └── __init__.py
│   └── __init__.py
└── __init__.py

__init__.py文件定义每个(子)模块的内容。在上面的例子中,它们都是空的。因此,让我们导入qiskit.aqua.components并检查模块:

代码语言:javascript
运行
复制
>>> import qiskit.aqua.components
>>> qiskit.aqua.components
<module 'qiskit.aqua.components' from '/tmp/qiskit/aqua/components/__init__.py'>
>>> dir(qiskit.aqua.components)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
>>> qiskit.aqua.components.oracles
...
AttributeError: module 'qiskit.aqua.components' has no attribute 'oracles'

由于components/__init__.py没有选择公开其子模块,因此无法从该模块中访问它们。我们可以通过向components/__init__.py添加from . import oracles来改变这一点

代码语言:javascript
运行
复制
$ cat qiskit/aqua/components/__init__.py 
from . import oracles

现在让我们再次导入模块(由于module caching,需要重启Python REPL ):

代码语言:javascript
运行
复制
>>> import qiskit.aqua.components
>>> dir(qiskit.aqua.components)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'oracles']
>>> qiskit.aqua.components.oracles
<module 'qiskit.aqua.components.oracles' from '/tmp/qiskit/aqua/components/oracles/__init__.py'>

正如我们所看到的,oracles模块现在可以访问了。

对于您的特定示例,qiskit/aqua/components/__init__.py文件不导入oracles子模块,因此您需要单独导入它才能访问它。

关于import x.y.z的说明:这首先导入x,然后导入x.y,最后导入x.y.z,从而使这些模块可用。但它仅限于此,并且不会在模块嵌套中进一步深入,因此任何其他子模块都需要手动导入(例如import x.y.z.foo)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60716008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档