12_模块包与程序入口
把代码拆到多个文件,理解导入和 `__name__`。
Python 基础专题 12:模块、包与程序入口
学习目标:把代码拆到多个文件,理解导入和
__name__。
核心知识
一个 .py 文件就是模块。import math 导入模块后用 math.sqrt(9) 调用;from math import sqrt 把函数名引入当前命名空间。标准库、第三方包和项目模块要分清。项目包通常是一个目录,可放 __init__.py 表示包边界;相对导入依赖包上下文,直接运行包内文件时可能失败。
# app.py
def square(number: int) -> int:
return number * number
def main() -> None:
print(square(4))
if __name__ == "__main__":
main()
直接执行 python3 app.py 时,该模块的 __name__ 为 "__main__";被别的模块导入时通常是模块名。因此入口保护可防止导入时自动执行命令行逻辑。导入会执行模块顶层代码一次,随后由模块缓存复用;不要在模块顶层发网络请求或执行难以控制的副作用。
sys.path 决定查找模块的路径,项目结构混乱时容易“本机能导入、部署不能导入”。建议从项目根目录运行 python3 -m 包名.模块名,并给文件选择不会与 json.py、typing.py 等标准库撞名的名称。
逐步理解
尝试在交互式解释器执行 import math; math.sqrt(9),再执行 import math; math.sqrt(16);第二次导入通常复用已加载模块。模块顶层代码因此应尽量只定义函数、类和常量。入口函数 main() 把命令行交互与纯业务函数分开,使导入模块时不会意外打印或修改文件。
动手练习
练习:把 square 放到 math_tools.py,在 app.py 中导入并打印平方值。答案要点:from math_tools import square,命令从两个文件所在目录运行。