python的__name == '__main__'

44 阅读2分钟

简单来说,if __name__ == "__main__": 是 Python 程序的入口检查点

它的主要作用是:区分“直接运行脚本”和“被当作模块导入”这两种情况。


1. 核心原理

每一个 Python 文件(模块)在运行时,Python 解释器都会自动定义一个内置变量 __name__

  • 当你直接运行这个脚本时(例如在终端输入 python script.py): Python 会把 __name__ 赋值为 "__main__"
  • 当这个脚本被其他文件导入时(例如 import script): Python 会把 __name__ 赋值为脚本的文件名

2. 代码示例演示

假设我们有一个文件叫 const.py

# const.py

def add(a, b):
    return a + b

# 下面这段代码我们只想在直接运行 const.py 时执行
# 不希望别人 import add 的时候也触发打印
if __name__ == "__main__":
    print("正在直接运行 const.py")
    result = add(10, 20)
    print(f"测试结果是: {result}")

情况 A:直接运行 const.py

终端输入:python const.py 输出:

正在直接运行 const.py
测试结果是: 30

原因:此时 __name__ 等于 "__main__",if 成立。

情况 B:在另一个文件 main.py 中调用

# main.py
import const

print("这里是 main.py")
print(const.add(1, 2))

终端输入:python main.py 输出:

这里是 main.py
3

原因:当 main.py 导入 const 时,const.py 里的 __name__ 变成了 "const"。if 语句不成立,所以里面的 print 语句不会执行


3. 为什么要这么用?(应用场景)

1. 防止“副作用”

如果你在写一个工具函数库,里面定义了很多函数。你可能想在文件末尾写一些测试代码来确保函数写对了。如果不加 if __name__ == "__main__":,别人一旦 import 你的文件,你的测试代码(比如打印、读写文件、连接数据库)就会自动运行,干扰别人的程序。

2. 提高性能

导入模块时,Python 会从头到尾执行一次该文件。把不需要的代码放在 if 块里,可以避免在被导入时执行不必要的计算。

3. 标准的项目结构

在专业的 Python 开发中,通常会把逻辑写在函数里,然后用 main() 函数作为入口:

def main():
    # 程序的逻辑起点
    pass

if __name__ == "__main__":
    main()

总结

  • __name__ 是 Python 的一个内置变量。
  • 直接跑脚本__name__"__main__"
  • 作为模块导入__name__ 为文件名。
  • if __name__ == "__main__": 确保了只有在你手动运行该文件时,其中的代码块才会执行。