前言
我们在阅读别人的代码的时候,经常会看到if __name__ == "__main__"
这句代码到底是什么意思呢?
一般情况下,当我们写完自定义的模块之后,我们一般会自己测试一下,检验模块中的各个功能是否能成功执行。
例如,创建一个candf.py模块如下:
def c2f(cel):
fah = cel * 1.8 + 32
return fah
def f2c(fah):
cel = (fah - 32) / 1.8
return cel
def test():
print("测试数据:0 摄氏度 = %.2f 华氏度" % c2f(0))
print("测试数据:0 华氏度 = %.2f 摄氏度" % f2c(0))
test()
单独运行此模块文件,可以看到如下运行结果:
测试数据:0 摄氏度 = 32.00 华氏度
测试数据:0 华氏度 = -17.78 摄氏度
然后,我们在candf.py模块的同一目录下,创建另一个模块demo.py,如下:
import candf
print("32 摄氏度 = %.2f 华氏度" % candf.c2f(32))
print("99 华氏度 = %.2f 摄氏度" % candf.f2c(99))
运行demo.py模块的结果如下所示:
测试数据:0 摄氏度 = 32.00 华氏度
测试数据:0 华氏度 = -17.78 摄氏度
32 摄氏度 = 89.60 华氏度
99 华氏度 = 37.22 摄氏度
可以看到,Python解释器将模块(candf.py)中的测试代码也一块儿运行了,这并不是我们想要的结果。
想要避免这种情况的关键在于,要让 Python 解释器知道,当前要运行的程度代码,是模块文件本身,还是导入模块的其它程序。
为了实现这一点,就需要使用 Python 内置的系统变量 __name__,它用于标识所在模块的模块名。
例如,在 demo.py 程序文件中,添加如下代码:
print(__name__)
print(candf.__name__)
其运行结果为:
__main__
candf
可以看到,当前运行的程序,其 __name__ 的值为 __main__,而导入到当前程序中的模块,其 __name__ 值为自己的模块名。
因此,if __name__ == '__main__':的作用是确保只有单独运行该模块时,此表达式才成立,才可以进入此判断语法,执行其中的测试代码;
反之,如果只是作为模块导入到其他程序文件中,则此表达式将不成立,运行其它程序时,也就不会执行该判断语句中的测试代码。