python - 在导入中包含包层次结构
问题描述
我是 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
)直接导入到其他文件中。结果与我想要的类似,但我觉得这可能是一个不好的方法。
有没有好的方法来做到这一点?
解决方案
你的第二种方法是好方法。
绝对方法是保持一切完好无损的好方法,但我个人更喜欢采用相对方法(以防未来设计更改)。
最好__init__.py
在每个 python 包中编写一个(python3+ 甚至在没有初始化文件的情况下导入它),在这个初始化文件中,您可以使用__all__
.
如果数据在这里是唯一的,也不要使用from game import ui.data
使用,否则只做一个 或 (@smitelli 的改进建议)from game.ui import data
from game import ui
uidata=ui.data(*args,**kwargs)
from game.ui import data as ui_data
有关更多项目结构,请阅读PEP-8 指南
推荐阅读
- php - laravel 应用程序的 ssl 证书不起作用
- wordpress - 如何加载测试 wordpress 网站?
- php - 将表单数据转换为 PDF 并将该 PDF 存储在服务器上
- github - 来自 RStudio 的 Git 提交错误:“系统找不到指定的路径”
- python - 检查子字符串是否存在于字符串中的特定位置
- javascript - 无法从客户端代码调用位于库中的服务器端函数
- java - Firebase 消息传递仅适用于单独的设备
- c++ - 编译时 Visual Studio 找不到 vcvars64.bat,即使它存在
- amazon-cognito - 如何建立从用户池到 aws appsync 模型的数据关系
- android - 我想在 Multipart 类中获取 SharedPreference 数据