当前位置:首页>python>为什么 python 中经常出现 if __name__ == '__main__'

为什么 python 中经常出现 if __name__ == '__main__'

  • 2026-08-26 06:45:40
为什么 python 中经常出现 if __name__ == '__main__'
最近在写 python 程序的时候,经常利用 AI 工具偷懒,但是发现 AI 写的时候主程序总是:
if __name__ == '__main__'
笔者虽然知道很多python程序这么写,但是并不喜欢这么写,因为平时写的脚本并不复杂,一般是面向结构的方法,按照顺序执行即可,并不愿意多写一个 if 判断,并且字也挺多的,那么为什么 AI 这么喜欢写?那肯定也是模仿过来的。
所以,为什么大多数工程师都这么写?这么写有什么好处?笔者花了点时间研究了下。主要是参考官方文档。
首先,前后2 个下划线代表什么?
在 python 中,前面 2 个下划线代表私有变量,外部不能访问,前后 2 个下划线代表特殊变量,比如__init__ ,__name__ ,__main__,说白了,就是 python 运行时自己内部要使用的,可以外部访问,但是不能和这些变量命名冲突。
那么,__main__和__name__具体指什么呢?
直接看官网的解释。

__main__ 是顶层代码运行环境的名称。“顶层代码”是指由用户指定的最先开始运行的那一个 Python 模块。之所以它是“顶层”,是因为它将导入程序所需的所有其它模块。有时“顶层代码”被称为应用程序的 入口点。

https://docs.python.org/zh-cn/3/library/__main__.html

模块是包含 Python 定义和语句的文件。其文件名是模块名加后缀名 .py 。在模块内部,通过全局变量 __name__ 可以获取模块名(即字符串)

https://docs.python.org/zh-cn/3/tutorial/modules.html#tut-modules
说得通俗一点,就是当我们运行命令
python3 XXX.py
这个时候就叫运行了顶层环境, XXX.py 的名字本来是XXX,但是这个时候__name__ 不等于 XXX,而是等于__main__。
那么什么时候等于 XXX 呢,就是不在运行顶层环境的时候,比如在程序中
import XXX
所以 if __name__ == '__main__' 这个判断,就是在判断是否是运行在顶层环境!
这么做的好处就是当代码比较复杂的时候,通过这个判断能够避免别的程序文件被执行!因为顶层环境入口就一个!
反过来,如果在某个文件中写入
import __main__
那么这个文件中能够获取到顶层环境入口的变量值!
可以做个测试:
#! /usr/bin/python3# start.pyimport sysfrom namely import print_namemy_name = "Stephen Hammer"def main():    try:        print_name()    except ValueError as ve:        return str(ve)if __name__ == "__main__":    sys.exit(main())
# namely.pyimport __main__def did_user_define_their_name():    print(__main__)    print(dir(__main__)) #列出对象的所有属性和方法    return 'my_name' in dir(__main__)def print_name():    if not did_user_define_their_name():        raise ValueError('Define the variable `name`!')    print(__main__.my_name)
看下运行结果:
$ /usr/bin/python3 start.py
namely.py中的函数获取到了 start.py 中定义的 my_name值!
所以这里就引入了编程 tips:
  1. 尽可能少的语句放在位于 if__name__=='__main__' 之下的代码块中,提高代码的清晰度和准确度。 
  2. 最好由一个名为 main 的函数来封装程序的主要行为,并放在 if 块内。因为如果程序直接放在 if块内,那么这个 phrase 变量就是全局变量,其他模块的函数可能会无意中使用到全局变量,容易出错。 
有个大牛博主的视频也可以看下:

最新文章

随机文章