自动加载子模块时出现 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
然后为了自动加载子模块 echo
和 reverse
我将以下导入语句添加到我的 effects/__init__.py
文件
from . import echo
from . import reverse
然而,在我导入 sound.effects
之后,我在尝试访问 echo
和 reverse
:
时仍然遇到 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.echo
和 sound.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
我的包结构像 this:
sound/
├── effects
│ ├── echo.py
│ ├── __init__.py
│ └── reverse.py
├── formats
│ ├── __init__.py
│ ├── waveread.py
│ └── wavewrite.py
└── __init__.py
然后为了自动加载子模块 echo
和 reverse
我将以下导入语句添加到我的 effects/__init__.py
文件
from . import echo
from . import reverse
然而,在我导入 sound.effects
之后,我在尝试访问 echo
和 reverse
:
>>> 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.echo
和 sound.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