最近在写 python 程序的时候,经常利用 AI 工具偷懒,但是发现 AI 写的时候主程序总是:if __name__ == '__main__'
笔者虽然知道很多python程序这么写,但是并不喜欢这么写,因为平时写的脚本并不复杂,一般是面向结构的方法,按照顺序执行即可,并不愿意多写一个 if 判断,并且字也挺多的,那么为什么 AI 这么喜欢写?那肯定也是模仿过来的。所以,为什么大多数工程师都这么写?这么写有什么好处?笔者花了点时间研究了下。主要是参考官方文档。在 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
这个时候就叫运行了顶层环境, XXX.py 的名字本来是XXX,但是这个时候__name__ 不等于 XXX,而是等于__main__。那么什么时候等于 XXX 呢,就是不在运行顶层环境的时候,比如在程序中所以 if __name__ == '__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值!- 尽可能少的语句放在位于
if__name__=='__main__' 之下的代码块中,提高代码的清晰度和准确度。 - 最好由一个名为
main 的函数来封装程序的主要行为,并放在 if 块内。因为如果程序直接放在 if块内,那么这个 phrase 变量就是全局变量,其他模块的函数可能会无意中使用到全局变量,容易出错。