我想从子模块导入一个类,而不必使用from submodule.submodule import Class
语法。相反,我只想像普通的Python3模块一样from submodule import Class
。
我觉得应该已经回答了一百万次,虽然在SO上有几个类似命名的问题,但它们都没有提供一个简单明了的简单解决方案。
我尝试使用此设置进行最简单的测试:
.
├── main.py
└── test
├── __init__.py
└── test.py
在我的test
模块中,我有以下内容:
test.py
class Test:
def __init__(self):
print('hello')
__初始化__。PY
from test import Test
__all__ = ['Test']
在上层 main.py 中,我有以下内容:
from test import Test
Test()
当我尝试运行main.py
时,我得到:
ImportError: cannot import name 'Test'
我知道我可以用main.py
替换from test.test import Test
中的import语句,但我的理解是__init__.py
的一个要点是在包级别上访问子模块(使用__all__
允许使用from test import *
)
答案 0 :(得分:1)
根据PEP 404:
在Python 3中,包中的隐式相对导入不再存在 可用 - 仅限绝对导入和显式相对导入 支持的。此外,星级导入(例如来自x import *)仅是 在模块级代码中允许。
如果您将__init__.py
更改为:
from test.test import Test
__all__ = ['Test']
然后您的代码可以运行:
$ python3 main.py
hello
但现在它仅适用于python3
(原始代码仅适用于python2
)。
要使代码适用于python的两行,我们必须使用显式相对导入:
from .test import Test
__all__ = ['Test']
代码执行:
$ python2 main.py
hello
$ python3 main.py
hello