自动加载子模块时出现 NameError

NameError when automatically loading a submodules

我的包结构像 this:

sound/
├── effects
│   ├── echo.py
│   ├── __init__.py
│   └── reverse.py
├── formats
│   ├── __init__.py
│   ├── waveread.py
│   └── wavewrite.py
└── __init__.py

然后为了自动加载子模块 echoreverse 我将以下导入语句添加到我的 effects/__init__.py 文件

from . import echo
from . import reverse

然而,在我导入 sound.effects 之后,我在尝试访问 echoreverse:

时仍然遇到 NameError
>>> import sound.effects
>>> echo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'echo' is not defined
>>> reverse
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'reverse' is not defined

我是不是漏掉了什么?

是的。您导入了 sound.effects,但这并没有将 effects 的内容带入您当前的命名空间。您仍然需要在它们所在的位置引用它们:sound.effects.echosound.effects.reverse.

如果您只想按名称引用它们,则需要导入这些名称:

from sound.effects import echo, reverse

基本上这就是 Python 命名空间的工作方式。

添加:

from . import echo

To effect/__init__.py 将名称 echo 导入 effect 命名空间。当您导入模块时,它会执行模块代码,但在模块命名空间中而不是您的主程序命名空间中。

在您的示例中,您可以将 echo 作为 sound.effect.echo 访问,甚至可以将其导入(在您的主文件中)作为:

from sound.effect import echo