Python

27|模块、import 与 __name__

面向按顺序学习 Python 的初学者,本篇在第 22、25 篇知识上,帮助读者把函数拆到不同文件并控制脚本入口。

◉ 1.2k 字◌ 8 分钟♙ 郑在混

这套课程按知识依赖排列。本篇的前置知识是:第 22、25 篇。学完后,你应该能够把函数拆到不同文件并控制脚本入口。

本篇要解决的问题

本篇只处理“模块、import 与 name”这一件事。示例基于 Python 3.14.6,在 macOS 环境核验;除明确标注的终端命令外,代码本身只使用 Python 标准能力。

先看清一个容易误解的细节

name 决定入口代码

同一个文件直接运行时 __name__ 等于 "__main__";被其他文件导入时,它等于模块名。入口判断可以避免导入时自动执行演示代码。

核心概念

  • 一个 .py 文件就是一个模块。
  • 导入时模块顶层代码会执行一次,因此顶层应以定义和常量为主。
  • 避免使用 from module import *,它会让名字来源不清楚。

跟着示例运行

先在同一个目录中创建两个文件。把函数放进 calculator.py

def add(left, right):
    return left + right

if __name__ == "__main__":
    print(add(2, 3))

再创建 app.py,从模块中导入函数:

from calculator import add

print(add(10, 20))

分别执行 python3 calculator.pypython3 app.py

预期结果:

直接运行 calculator.py 输出 5;运行 app.py 输出 30

输出中包含环境路径、集合元素或日志格式时,具体文字和顺序可能随本机环境变化;判断是否成功应以本篇说明的关键结果为准。

按执行顺序拆开看

  1. 直接运行 calculator.py 时,模块名是 __main__,入口代码输出 5。
  2. app.py 导入模块时,calculator.py 的函数定义会执行,但入口判断为假;随后 app.py 调用函数输出 30。

再看一个具体细节

同一个模块在“直接运行”和“被导入”两种方式下,入口判断结果不同。

直接运行与导入的入口差异

两条路径都会建立函数定义;只有直接运行时才执行 __main__ 保护下的演示代码。

初学者容易混淆的地方

  • 把两个示例文件粘成一个文件运行。应按注释分别保存为 calculator.pyapp.py
  • 模块名与标准库或项目其他文件重名,例如命名为 json.py,导致导入目标被遮蔽。

练习

  1. 创建 text_tools.py 并导出一个格式化函数。
  2. 分别直接运行模块和从另一个脚本导入,输出 __name__

练习应先独立完成,再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力,不要求提前搜索复杂写法。

本篇边界

本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程;先确保能够解释示例中每一行代码,再进入下一篇。

相关文章

© 2026 郑在混知识库 · 已运行 46 天 · 豫ICP备2026037626号-1