Python3 模块¶
概念与用途¶
每个 .py 文件都是模块,目录包用于组织模块和公开接口。导入模块时,Python 会执行其顶层代码并缓存模块对象;模块有助于隔离职责和复用功能。
核心语法与 API¶
使用 import math、from pathlib import Path 或相对导入 from .utils import helper。__all__ 可声明星号导出的公共名称,但显式导入仍更清晰。
| 导入形式 | 名称绑定 | 建议 |
|---|---|---|
import package.module |
绑定顶级包 | 来源最明确 |
from package import name |
直接绑定名称 | 常用公开 API |
from . import utils |
包内相对导入 | 仅在包上下文使用 |
importlib.import_module(name) |
运行时动态导入 | 插件系统,名称需白名单 |
import importlib
import math
module = importlib.import_module("json")
print(math.isqrt(81))
print(module.dumps({"ok": True}))
示例:建立最小包¶
目录 calculator/ 中放置 __init__.py 和 core.py。__init__.py 定义稳定公开接口,调用者不必依赖内部文件布局。
# calculator/core.py
def add(left: int, right: int) -> int:
return left + right
# calculator/__init__.py
from .core import add
__all__ = ["add"]
# app.py
from calculator import add
print(add(2, 3))
实际运行时应分别创建上述三个文件,并从其共同父目录执行 python app.py 或安装该包。模块首次导入后记录在 sys.modules,后续普通导入不会重新执行顶层代码;importlib.reload() 也不能可靠重置外部引用和全局资源。
包与执行边界¶
- 包内存在相对导入时,使用
python -m package.module,不要直接执行深层文件。 __init__.py应保持轻量,只重导出稳定 API,不应连接数据库或扫描网络。- 插件式动态导入必须限制可导入名称;用户提供任意模块名会扩大代码执行面。
常见错误与工程注意¶
- 不要把文件命名为
json.py、random.py等标准库名称,否则会遮蔽真实模块。 - 顶层不要执行网络请求或重任务,导入应快速且副作用可控。
- 循环导入通常说明模块职责或依赖方向需要调整。
- 开发项目应通过
pyproject.toml安装为可编辑包,而不是长期修改sys.path。