对Python中__name__ == '__main__'的理解

都说一个Python脚本中,

if __name__ == '__main__':

是程序运行的入口。

我认为这种说法并不正确,这只是一个条件表达式。我们应该关心的是条件何时成立,何时不成立。

新建一个名为test的package,添加两个python脚本test1.py和test2.py。

test1.py:

print('Not main')

if __name__ == '__main__':
    print('Equal')
else:
    print('Not equal')

test2.py:

from test import test1

print('Not main2')

if __name__ == '__main__':
    print('Is mian2')

运行test1,输出:

Not main1
Equal

输出Not main1,说明__name__ == '__main__'并不是程序的入口。所以,它就是一个条件表达式。

输出Equal,说明,当脚本运行时,满足__name__ == '__main__'的条件。

 

运行test2.py,输出:

Not main1
Not equal
Not main2
Is mian2

前两句出现在test1中。所以,虽然test2没有引用test1,而只是对test进行了导入,test1也是会被运行的。而输出了Not equal这说明,当脚本被导入而触发执行时,__name__ == '__main__'的条件是不满足的。

之后才输出了test2中的语句,但这并不能说明导入模块要先执行。实际上,这是因为Python脚本是顺序执行的缘故。

把test.py编辑为:

print('Not main2')

if __name__ == '__main__':
    print('Is mian2')

from test import test1

即,将导入模块的代码放到下方。运行test2,则输出就变成了:

Not main2
Is mian2
Not main1
Not equal

 

总结一下:

if __name__ == '__main__': 不能理解为程序运行时的入口,只是Python脚本单独运行时条件成立,被导入运行时不成立。(所以,可用作单元测试)

Python脚本是顺序执行的,并不是被导入的模块先于本模块执行,只是导入模块往往在脚本的上方。

你可能感兴趣的:(Python应用,python)