前言
在很多代码中经常遇见if __name__ == '__main__'
,那么具体是什么作用呢?下面我来跟大家讲解了一下。
作用
众所周知,Python 编写的文件既可以直接运行,也可以当作模块被引用。不管是直接运行,还是引用,最顶层的代码(以缩进划分层次)都会被执行。而现实应用中,部分代码不希望在导入中执行(比如单元测试代码)。
if __name__ == '__main__'
的作用就是让放在它里面的代码块只有在直接运行时才执行,作为模块被引用时不执行。
举个例子,下面是一个 python 脚本文件test.py
test.py
print('outside1')
if __name__ == '__main__':
print('inside')
print('outside2')
在控制台,直接执行test.py
脚本时
直接执行脚本
但如果是把 test.py
当作模块引用时,可以看到最顶层的代码也会被执行,而为什么没有执行print('inside')
,是因为if
判断语句没有通过。
当作模块引用
原理
原因就是 __name__
这个内置变量。
内置变量 __name__
用于表示当前模块的名字。当直接执行当前模块 ,__name__
就等于 __main__
;而当引用当前模块时, __name__
就等于完整的包名
。
举个例子,这是一个 Python 源码文件 test.py
test.py
print(__name__)
当直接执行时, __name__
就等于 __main__
> python3 test.py
__main__
当引用当前模块时,__name__
就等于完整的包名
。
> python3
>>> import test
test
最后
如果学过 C 或者 C++,知道程序入口是一个 main 函数。if __name__ == '__main__':
的作用跟这个 main 函数相似,可以看作 Python 模拟的程序入口。而事实上,Python 是从源码文件的第一行开始,逐行解释然后运行,没有统一的程序入口。所以if __name__ == '__main__':
只能说是模拟的程序入口。