先来看一份代码:
# test.py
def addFunc(a, b):
return a + b
print('the result of test is: 1 + 1 = ', addFunc(1, 1))
# mode.py
import test
print('The result of test modula is :', test.addFunc(12, 23))
执行 mode.py 输出如下:
the result of test is: 1 + 1 = 2
The result of test modula is : 35
这里输出的语句中,同时包含了 test.py 和 mode.py 中的内容。那么问题来了,很多时候调用者并不需要输出 test.py 里面的内容,这个时候应该怎么处理呢?添加另外一个不输出的版本 test_no_print.py ?
python 中提供了 __name__ 这个系统变量来解决这个问题,先看修改后的代码:
# test.py
def addFunc(a, b):
return a + b
if __name__ == '__main__':
print('the result of test is: 1 + 1 = ', addFunc(1, 1))
单独执行 test.py 结果如下:
the result of test is: 1 + 1 = 2
没有问题,这是我们想要的结果。
执行 mode.py:
The result of test modula is : 35
这恰恰也是我们想要的结果。
那么问题来了,__name__ 里面究竟是个什么神奇的值?
修改 test.py 如下使其输出 __name__ 的值:
# test.py
def addFunc(a, b):
return a + b
if __name__ == '__main__':
print('the result of test is: 1 + 1 = ', addFunc(1, 1))
print("The value of '__name__' is ", __name__)
分别执行 test.py 和 mode.py 结果如下:
the result of test is: 1 + 1 = 2
The value of '__name__' is __main__
The value of '__name__' is test
The result of test modula is : 35
可以看到,单独执行 test.py 时,__name__ 的值是 ‘__main__’,而作为模块被 import 到其他文件中调用时,__name__ 的值则是模块的名字。
我们知道,有两种方法可以使用 python 文件来执行它实现的功能,一个是直接运行,一个是被其他文件导入后调用。当它被直接运行时,当前文件就是程序的主入口,这相当于 C 或者 Java 中的 main 函数。当它被其他文件导入调用时,程序的入口自然在其他文件中。
__name__ 是 python 的内置属性,这个系统全局变量用来表示当前模块的名字。而 __main__ 就是一个代表程序入口的字符串。 因此 if __name__ == ‘__main__’ 其实就是判断程序的入口是不是当前的文件!