通过导入包含包层次结构

Include package hierarchy with import

我是 Python 的新手,尤其是 Python 中的结构代码新手。我有一个简单的问题,但我不确定如何措辞。我正在寻找一个导入模块的命令,同时将其包层次结构作为其 namespace/scope 的一部分包含在内。这可能吗?。这里有一个简单的项目提供示例:

game (__init__.py)
    gameplay.py
    ui/
        window.py
        panel.py
        data.py

我相信我可以使用绝对语法将 ui/data.py 之类的模块导入 gameplay.py,例如:

import game.ui.data.py

但我认为这需要从一开始就深入挖掘层次结构(项目名称),而不管模块是在哪里导入的,或者活动模块与导入模块的关系如何。示例:control = game.ui.data.controller.

我唯一熟悉的其他类型的导入是相对导入:

from . ui import data.py

这似乎转储了模块的所有父包装,像活动模块 (control = data.controller) 的子模块一样导入模块。

所以这是我希望在几种情况下做的(无效的)示例:

from game import ui.data

control = ui.data.controller

在测试了一些东西之后,我发现我可以编写一个包初始化文件 (ui\__init__.py) 来导入它自己的所有文件,然后直接导入该包名称 (from . import ui)到其他文件中。结果与我想要的类似,但我觉得这可能是一种糟糕的方法。

有什么好的方法吗?

你的第二种方法很好。

绝对方法是保持一切完好无损的好方法,但我个人更喜欢做相对方法(以防将来设计更改)。

最好在每个 python 包中写一个 __init__.py (python3+ import it without even a init file) ,在这个 init frile 你可以写 tge 函数你想使用 __all__ .

暴露在外部 python 环境中

也不要使用 from game import ui.data 使用 from game.ui import data 如果这里的数据是唯一的,否则做 from game import ui 然后做一个 uidata=ui.data(*args,**kwargs)from game.ui import data as ui_data(改进建议通过@smitelli)

更多项目结构请阅读PEP-8 guidelines