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

结合场景再看三个关注点

  1. import math as m 在当前模块绑定名字。
  2. 真实包用 package.submodule 绝对路径更稳。
  3. 循环导入靠边界重划与延迟 import 处理。

核心概念与准确模型

概念含义
模块通常一个 .py
含子模块的命名空间(常有 __init__.py
sys.modules导入缓存
绝对导入from billing.pricing import quote
相对导入from .pricing import quote(仅包内)

边界情况与反直觉行为

  1. 脚本目录 vs 已安装包 同名遮蔽。
  2. 相对导入不能在脚本顶层随意跑。
  3. from x import * 污染命名空间。

常见误区

[!warning] 常见误区:用 sys.path.append 当工程方案 错误理解:临时路径即架构。
正确模型:可编辑安装/正确包布局。

工程实践

  • 包对外导出在 __init__ 克制
  • 公共 API 绝对导入
  • 应用入口 python -m

本节总结

导入是依赖显式化工具。包边界清晰比“能 import 就行”更重要。

自测题

  1. 再次 import 同一模块会重新执行吗?
  2. 为何推荐绝对导入?
参考答案
  1. 通常不会,命中 sys.modules
  2. 路径稳定、对重构与工具更友好。

延伸阅读与资料来源

资料类型支撑内容
Modules tutorial教程模块与包
Import system规范导入
创建于 2026/7/15 更新于 2026/7/15