我是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
)直接导入到其他文件中。文件。结果类似于我想要的结果,但我觉得这可能是执行此操作的不好方法。
有什么好方法吗?
答案 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 ui
或uidata=ui.data(*args,**kwargs)
(@的改进建议smitelli)
有关更多项目结构的信息,请阅读PEP-8 guidelines