如何仅扁平化一个模块的命名空间?

2 投票
1 回答
1162 浏览
提问于 2025-04-18 16:39

我有一个简单的项目和包的结构,如下所示:

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

撰写回答