python如何导入包
·
假设你的项目结构为:
your_project/
├── fastreid/ # 自定义包
│ ├── __init__.py
│ └── config/
│ ├── __init__.py
│ └── config.py
└── your_script.py # 你的脚本
-
在
config.py中定义函数:# fastreid/config/config.py def get_cfg(): print("Config loaded!") -
在子包初始化文件中暴露函数:
# fastreid/config/__init__.py from .config import get_cfg -
在脚本中测试导入:
# your_script.py from fastreid.config import get_cfg get_cfg() # 输出 "Config loaded!"
# 在 fastreid/config/__init__.py 文件中:
# 相对导入:从当前包(config子包)的 config 模块中导入指定对象
from .config import CfgNode, get_cfg, global_cfg, set_global_cfg, configurable
# 定义 __all__ 列表,明确声明对外暴露的公共接口
__all__ = [
'CfgNode',
'get_cfg',
'global_cfg',
'set_global_cfg',
'configurable'
]
代码作用解释 🛠️
-
相对导入 (
from .config import ...):.config表示从当前包(config子包) 的同级模块config.py导入对象- 例如:
CfgNode和get_cfg实际定义在fastreid/config/config.py文件中
-
__all__的作用:- 显式声明该模块对外公开的接口(公共API)
- 当使用
from fastreid.config import *时,只会导入__all__中列出的对象 - 避免暴露内部实现细节(如未列出的其他类/函数)
为什么这样设计? 🤔
1. 封装性
- 通过
__all__明确暴露用户需要使用的核心功能(如get_cfg),隐藏模块内部其他辅助类/函数 - 示例:用户只需知道
from fastreid.config import get_cfg,无需关心CfgNode的实现细节
2. 维护性
- 如果后续
config.py新增内部函数(如_internal_helper),但未加入__all__,则外部代码无法通过import *意外引用它 - 减少因模块内部修改导致的外部代码兼容性问题
3. 导入便捷性
- 通过
__init__.py的导入操作,用户可以直接从包顶层访问核心对象:Python
# 用户代码示例 from fastreid.config import get_cfg # 直接调用,无需写 from fastreid.config.config import get_cfg cfg = get_cfg()
类比理解 🍎
想象一个工具箱(config子包):
config.py:工具箱内的所有工具(包括螺丝刀、锤子等)__init__.py:工具箱的展示窗口,只将常用工具(__all__列出的)放在窗口显眼位置- 用户:只需打开工具箱(
import fastreid.config),直接拿取展示窗口的工具,无需翻找内部抽屉
典型应用场景 🌟
当包需要提供简洁的API时,这种模式可以让用户:
- 避免冗长的导入路径(如
from package.submodule.subsubmodule import func) - 清晰了解哪些是官方推荐使用的接口
- 降低因误用内部代码导致的问题
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)