如何仅扁平化一个模块的命名空间?
我有一个简单的项目和包的结构,如下所示:
Project/
package/
__init__.py
a.py
class One: ...
class Two: ...
b.py
from . import a
class Three: ...
class Four: ...
我希望用户能够这样使用它:
import package
# or
from package import Three, Four
from package.a import One, Two
# or
from package import a
我在 __init__.py
文件中尝试了几种 from...import
的用法,但都没有成功!以下是我在 Project/package/__init__.py
中尝试过的内容,以及在尝试 import package
时出现的错误:
from .b import Three, Four
# ImportError: No module named 'package.b'
---
from b import Three, Four
# ImportError: No module named 'b'
---
from package.b import Three, Four
# ImportError: cannot import name Three
我以为我在上一个项目中已经解决了这个问题……(请参见:这个回答)
简而言之
我需要在 Project/package/__init__.py
中放入什么,才能让用户直接从我的包中导入类 Three 和 Four,而不需要知道它们在哪个模块里?换句话说,我该如何简化模块 b
的命名空间?
编辑:使用的是 Python 3.3,但我可能会切换到 3.4,并且可能还需要支持 2.7。
编辑:添加了简而言之
编辑:为了清晰起见,显著重新格式化了问题
编辑:更新标题以反映清晰度 :)
编辑:添加了对一个类似(已解决)问题的引用,但在这种情况下似乎不适用
1 个回答
0
你不需要使用点:就是这么简单。
在 b.py 文件中:
from a import Three, Four
看起来你的程序在寻找一个 package.b
,而不仅仅是 b。这可能意味着使用点是行不通的。
从 from .a import
得到的输出:
File "/storage/emulated/0/com.hipipal.qpyplus/scripts3/.last_tmp.py", line 1, in <module>
from .a import One, Two
ValueError: Attempted relative import in non-package
从 from a import
得到的输出(这是预期的)
1
2