模块既可以被导入(到 Python shell 或者其他模块中),也可以作为脚本来执行。
所有模块都有一个内置的属性 __name__,__name__ 的值取决于如何使用这个模块。
当模块被导入时,模块名称是文件名;而当模块作为脚本独立运行时,名称为 __main__。
让模块既可以导入又可以执行
回到最初的问题:if __name__ == '__main__':?
通过上面的结论,可以推断出:只有当模块直接运行(即:不导入)时,才会执行 if 块内的代码。
修改一下 calc.py 模块,内容如下:
def add(a, b):
return a + b
print('test: 2 + 3 =', add(2, 3))
如果模块只会被用作脚本,那没什么问题,但若希望将其作为一个导入模块时,往往不想打印出测试用例。在这种情况下,__name__ 就派上用场了。
完善 calc.py 模块,为其添加一个 if 语句:
def add(a, b):
return a + b
if __name__ == '__main__':
print('test: 2 + 3 =', add(2, 3))
这时,再导入模块,不会执行任何打印语句:
>>> import calc
而将其作为脚本直接运行,却可以正常打印:
$ python calc.py
test: 2 + 3 = 5
这就是 __name__ 的神奇之处,可以利用这个特性为模块提供用户界面,或对模块进行测试(将模块作为脚本运行,来执行测试用例)。