
通过在子包的 __init__.py 中显式导入并重新导出内部模块内容,可将 from web.web import * 简化为 from web import *,无需改变目录结构,仅需合理配置包初始化文件。
通过在子包的 `__init__.py` 中显式导入并重新导出内部模块内容,可将 `from web.web import *` 简化为 `from web import *`,无需改变目录结构,仅需合理配置包初始化文件。
在 Python 中,from package import * 的行为由该包的 __init__.py 文件决定——它本质上定义了“当用户导入该包时,哪些名称应当对外可见”。默认情况下,web/__init__.py 为空,因此 from web import * 不会自动导入 web/web.py 中的内容。但只需在 web/__init__.py 中主动导入并暴露所需符号,即可实现导入路径的简化。
✅ 正确做法如下:
- 确保 web/__init__.py 存在且非空(即使只有一行);
- 在其中显式导入目标模块的内容,并选择性地导出(推荐使用 from .module import * 或明确列出名称);
- *避免滥用 `导入**:生产环境建议显式声明all,以控制import *` 的行为并提升可维护性。
示例代码:
# web/__init__.py from .web import TEST, WebConfig # 推荐:显式导入关键类/变量 # 或(若需全部导出且 web.py 中已定义 __all__): # from .web import *
# web/web.py
TEST = "test"
WebConfig = type("WebConfig", (), {"debug": True})
# 可选:明确定义可被 * 导入的名称(强烈建议)
__all__ = ["TEST", "WebConfig"]
# main.py from web import TEST, WebConfig # ✅ 清晰、安全、可静态分析 # 或(不推荐用于生产) from web import * print(TEST) # 输出: test
⚠️ 注意事项:
- from module import * 在大型项目中易引发命名冲突和可读性问题,应优先采用显式导入(如 from web import WebConfig);
- 若仍需支持 from web import *,务必在 web/web.py 中定义 __all__,否则 * 可能导入所有非私有名称(包括下划线开头的意外变量);
- web/__init__.py 中的相对导入(如 from .web import ...)依赖于包的正确执行上下文——确保以 python -m 方式运行或作为包被导入,而非直接执行 main.py(此时需保证当前目录在 sys.path 中)。
通过这一机制,你既能保持清晰的模块划分(web.py 与 utils.py 各司其职),又能提供简洁一致的顶层导入接口,兼顾组织性与易用性。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











