我正在尝试使用IBM的Qiskit,这是一个用于量子计算电路设计和仿真的Python库。
特别是,我需要使用子模块qiskit.aqua.components.oracle,它是qiskit.aqua.components的一个子模块。然而,当我尝试
import qiskit.aqua.components只导入qiskit.aqua.components中的一些子模块,而不是所有的子模块。

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

如果我快速浏览一下源代码(https://github.com/Qiskit/qiskit-aqua/tree/master/qiskit/aqua),我看不出有任何特殊的原因会出现这种情况。有人能帮我吗?
发布于 2021-02-07 05:35:29
当您导入(子)模块时,模块本身决定它公开哪些成员。更进一步的子模块不会自动包括在内。在您的示例中,导入qiskit.aqua.components,components模块通过其__init__.py决定它公开的成员。下面是一个示例结构:
qiskit/
├── aqua
│ ├── components
│ │ ├── __init__.py
│ │ └── oracles
│ │ └── __init__.py
│ └── __init__.py
└── __init__.py__init__.py文件定义每个(子)模块的内容。在上面的例子中,它们都是空的。因此,让我们导入qiskit.aqua.components并检查模块:
>>> 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来改变这一点
$ cat qiskit/aqua/components/__init__.py
from . import oracles现在让我们再次导入模块(由于module caching,需要重启Python REPL ):
>>> 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)。
https://stackoverflow.com/questions/60716008
复制相似问题