Python 模块、包与导入
模块是文件,包是命名空间;import 绑定名字并缓存于 sys.modules,绝对/相对导入与可见性约定。
#type / concept
#status / growing
#tech / dev
#resource / python
#tech / lang / python
[!info] 关联笔记
Python 模块、包与导入
这个概念为什么出现
项目一大,单文件不可维持。模块/包划分边界,import 决定依赖是否显式、是否循环、测试能否导入。
[!abstract] 一句话理解 模块是可导入的代码单元,包是模块的层级命名空间;import 执行模块并缓存,优先绝对导入与清晰包边界。
最小可运行示例
先把示例放进业务场景,再看代码:
场景:billing 包导出计价函数供 API 使用
# 以下为可运行单文件演示 import 绑定(真实项目拆多文件)。
# import_binding_demo.py
# 业务意图:展示 import / from-import 绑定差异。
# 教学点:
# - import 绑定模块对象;
# - from 绑定属性快照;
# - 模块缓存直觉。
import math as m
def quote(price: float) -> float:
return m.ceil(price)
def main() -> None:
print(quote(10.2))
print("math name:", m.__name__)
if __name__ == "__main__":
main()
建议运行:
python import_binding_demo.py
期望输出:
11
math name: math
结合场景再看三个关注点
import math as m在当前模块绑定名字。- 真实包用
package.submodule绝对路径更稳。 - 循环导入靠边界重划与延迟 import 处理。
核心概念与准确模型
| 概念 | 含义 |
|---|---|
| 模块 | 通常一个 .py |
| 包 | 含子模块的命名空间(常有 __init__.py) |
sys.modules | 导入缓存 |
| 绝对导入 | from billing.pricing import quote |
| 相对导入 | from .pricing import quote(仅包内) |
边界情况与反直觉行为
- 脚本目录 vs 已安装包 同名遮蔽。
- 相对导入不能在脚本顶层随意跑。
from x import *污染命名空间。
常见误区
[!warning] 常见误区:用 sys.path.append 当工程方案 错误理解:临时路径即架构。
正确模型:可编辑安装/正确包布局。
工程实践
- 包对外导出在
__init__克制 - 公共 API 绝对导入
- 应用入口
python -m
本节总结
导入是依赖显式化工具。包边界清晰比“能 import 就行”更重要。
自测题
- 再次 import 同一模块会重新执行吗?
- 为何推荐绝对导入?
参考答案
- 通常不会,命中
sys.modules。 - 路径稳定、对重构与工具更友好。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Modules tutorial | 教程 | 模块与包 |
| Import system | 规范 | 导入 |