在介绍这个if __name__ == '__main__'的作用之前,需要补充一些Python知识作为铺垫:

  1. Python中双下划线开头且结尾的是内置的变量或函数。
  2. Python不像Java一样有主函数,它是脚本语言,是从上往下按顺序执行的(执行所有顶层代码,也就是没有缩进的代码)。
  3. 一个py文件(例如:mian.py)可以理解为一个模块,这个模块可以自己单独执行,也可以被导入其他模块中执行。
  4. 如果模块A被导入到模块B中,则模块A中的顶层代码也会被执行一遍的。

下面我们先通过一些例子看看__name__是什么?

1. __name__是什么?

先定义一个main_module.py

1
print(__name__)

再定义一个other_module.py

1
2
import main_module
print(__name__)

执行main_module.py得到如下输出:

1
__main__

执行other_module.py得到如下输出:

1
2
main_module
__main__

可以看出,当前模块被直接执行时__name__就是__main__,当前模块作为被导入模块执行时__name__就是模块名。

2. 为什么要使用if __name__ == '__main__'?

此处举一个例子大家就可以理解为什么要使用if __name__ == '__main__'了。

假设我写了个模块square_perimeter.py,用于计算正方形周长:

1
2
3
4
5
def calculate(length):
    print(length * 4)


calculate(5)

直接执行上述模块,可以得到如下输出:

1
20

现在假设有一个模块(test.py)中需要用到该计算正方形周长的模块:

1
2
import square_perimeter as sp
sp.calculate(8)

执行test.py可以得到如下输出:

1
2
20
32

可见,我们在square_perimeter.py中写的单测也被执行了,这如何了得?此时我们就可以按如下方法来改造square_perimeter.py

1
2
3
4
5
6
def calculate(length):
    print(length * 4)

    
if __name__ == '__main__':
    calculate(5)

此时直接执行square_perimeter.py可以得到:

1
20

执行test.py可以得到:

1
32

所以,if __name__ == '__main__'可以用于设置一段仅在直接执行该模块时才被执行的代码。

无论是有主函数的语言,还是脚本型的语言,其一个被执行的程序的入口肯定只有一个,所以该判断也可以用于判断程序的入口,即是从当前模块开始执行的,还是从其他模块开始执行的,然后基于此做一些逻辑。