自动加载子模块时的NameError

时间:2016-01-30 12:28:45

标签: python python-3.5

我的包结构如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

我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

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

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

from sound.effects import echo, reverse

答案 1 :(得分:1)

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

添加:

from . import echo

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

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

from sound.effect import echo