首页 > 解决方案 > 在导入中包含包层次结构

问题描述

我是 Python 新手,尤其是在 Python 中构建代码的新手。我有一个简单的问题,但我不知道如何表达它。我正在寻找一个导入模块的命令,同时将其包层次结构作为其命名空间/范围的一部分。这可能吗?。下面是一个简单的项目来提供一个例子:

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)直接导入到其他文件中。结果与我想要的类似,但我觉得这可能是一个不好的方法。

有没有好的方法来做到这一点?

标签: pythonpython-import

解决方案


你的第二种方法是好方法。

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

最好__init__.py在每个 python 包中编写一个(python3+ 甚至在没有初始化文件的情况下导入它),在这个初始化文件中,您可以使用__all__.

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

有关更多项目结构,请阅读PEP-8 指南


推荐阅读