About if __name__=='__main__' in Python

Overview

关于if __name__ == '__main__',一直想写个笔记,但是老忘,这里总结下。

总的来说,这句代码的作用是既能保证当前的py文件直接运行,也能保证其可以作为模块被其他py文件导入

怎么理解这句话呢?我们通过几个小例子来看下。

Code
__name__

首先任意创建一个py文件,仅输入一行代码

print(__name__)

然后运行,输出:

main

这说明,__name__本身是一个变量,但是不是一般的变量。它是在程序执行前就创建并赋值的,而赋值的机制是这里的关键。

在当前程序被当作主程序被执行的时候,__name__自动被赋值为固定的字符串__main__,当作为模块被其他文件调用的时候,自动被赋值为模块所在的文件名。

看下面一段程序,新建name_main.py文件:

1
2
3
4
5
6
7
8
9
10

def printHello():
print("Hello World!")
print(__name__)


if __name__ == '__main__':
printHello()


输出:

Hello World!
main

那么,我们知道__name__此处是被赋值为__main__的,那么程序的逻辑就很清楚了。先是定义了一个函数,然后判断语句,最后判断通过执行函数。也许会问,不要这个判断,程序不是一样执行吗?当然,一样是可以的,我们完全可以写成下面这样:

1
2
3
4
5
6
7

def printHello():
print("Hello World!")
print(__name__)

printHello()

但是,问题就在与,当其作为模块被调用的时候。看下面一节的解释。

from xxx import xxx

保持name_main.py文件没有if语句,新建main_name1.py文件,如下:

1
2
3
4

from name_main import printHello
printHello()

想一下,会发生什么?先看输出:

Hello World!
name_main
Hello World!
name_main

首先,我们知道,作为模块调入,—__name__ 自动被赋值为模块所在文件名,这点在意料之中。但是,我们明显看到,函数被执行了两次,这就关键所在!因为,在没有判断语句的时候,name_main在被调入的过程中就自动执行了一次(因为name_main本身就包含执行函数的部分),被调入后我们又主动调用一次,所以是两次。

那么,现在if语句的作用已经十分明确了,就是保证不重复执行函数。也就有了下面py文件的一般写法:

name_main.py

1
2
3
4
5
6
7
8
9
10

def printHello():
print("Hello World!")
print(__name__)


if __name__ == '__main__':
printHello()


name_main1.py

1
2
3
4

from name_main import printHello
printHello()

这样,我们单独运行name_main.py:

Hello World!
main

单独运行name_main1.py:

Hello World!
name_main

可以看到,printHello函数都可以正常执行!这就是if __name__== '__main__'语句的作用。
它保证我们既可以单独调试一个文件的函数和类等,有不影响其他文件的调用。

再次看下开头的那句话:

既能保证当前的py文件直接运行,也能保证其可以作为模块被其他py文件导入

Reference

stackoverflow

本文标题:About if __name__=='__main__' in Python

文章作者:不秩稚童

发布时间:2017年05月08日 - 18:02:48

最后更新:2017年05月08日 - 18:41:48

原始链接:http://datahonor.com/2017/05/08/About-if-name-main-in-Python/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

击蒙御寇