在导入中包含包层次结构

时间:2019-11-21 23:41:16

标签: python python-import

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

有什么好方法吗?

1 个答案:

答案 0 :(得分:2)

第二种方法是个好方法。

绝对方法是使所有内容保持完整的好方法,但我个人更喜欢采用相对方法(以防将来的设计变更)。

最好在每个python包内编写一个__init__.py(python3 +甚至不包含init文件导入它),在此init框架中,您可以使用{{1}编写要暴露给外部python环境的tge函数}。

如果数据是唯一的,也不要使用__all__,而要使用from game import ui.data,而不要使用from game.ui import data然后做from game import uiuidata=ui.data(*args,**kwargs)(@的改进建议smitelli)

有关更多项目结构的信息,请阅读PEP-8 guidelines

相关问题