为了解释这个问题,我们首先构造一个程序文件module1.py,内容如下:
def func1():
print('hello')
print('the __name__ of module1 is: ' + __name__)
if __name__ == '__main__': # 很显然,这是一个条件语句
func1()
print('Now it\'s in module1')
当我们运行module1.py时,输出的结果为:
hello
the __name__ of module1 is: __main__
Now it's in module1
由输出可以知道,此时__name__
就等于__main__
。其实,python代码在每次运行时,就会有一些初始化好的内置变量,而__name__
就是其中之一。当在本文件(当前程序)中运行时,__name__
就等于__main__
,否则__name__
等于所在文件/模块的名称。
与module1.py在同一文件夹下,我们构造module2.py,内容如下:
import module1
module1.func1()
print('the __name__ of module2 is: ' + __name__)
运行modul2.py,输出为
hello
the __name__ of module1 is: module1
the __name__ of module2 is: __main__
上述输出结果证明了在当前环境下,func1中的__name__
等于它所在的模块/文件名,即module1;而当前文件的__name__
等于__main__
。
现在这个问题就很简单了。这条语句的意思就是:检查当前环境下的__name__
是否等于__main__
,如果等于,就执行if语句体的内容。
if __name__ == '__main__'
这条语句只有在__name__
所对应的文件下才会满足条件,所以,if语句体(body)的内容也只有在对应文件下才会执行,而这一特点在python设计模块(module)时带来极大的便利。
当我们设计好一个模块后,我们想运行一些测试代码,而这些测试代码我们不希望在别的文件import本模块时引入,造成干扰。解决方案就是我们把测试代码放入if __name__ == '__main__'
之后,这样,只有在运行测试本模块(本文件)时,测试代码才会执行。