如何展平一个模块的命名空间?

时间:2014-08-09 10:43:03

标签: python import structure packages importerror

我有以下简单的项目和包结构:

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

我在from...import尝试了多次使用__init__.py,但无济于事!以下是我尝试放入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

我以为我在上一个项目中已经解决了这个问题...(参见:this answer

TL; DR 我需要在Project/package/__init__.py中放置什么,以便用户可以直接从我的包中导入类Three和Four,而无需知道它们存在于哪个模块中?换句话说,如何展平模块b的命名空间?

编辑:使用Python 3.3,但我可能会切换到3.4,我可能还需要支持2.7。

编辑:添加了TL; DR

编辑:明确重新格式化问题

编辑:更新标题以反映清晰度:)

编辑:添加了对类似(已解决)问题的引用,这个问题在这种情况下似乎不起作用

1 个答案:

答案 0 :(得分: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