【Python】if name == '__main__'究竟有什么作用?
共 2467字,需浏览 5分钟
·
2022-11-01 12:34
1前言
在很多的源码中,我们经常可以看到有一句话
if __name__ == '__main__':
但是我们在运行的时候,又会发现把这句话删掉的时候却又不影响代码的执行,那为什么要加这么一句话呢?
本文将进一步介绍“if name == '__main__'”这命令的含义,以及在实际项目中如何应用。
2__name__的作用
python的变量中,分别有单下划线_xxx,双下划线__xxx,以及变量前后均有双下划线__xxx__
系统定义名字,一般前后均有一个“双下划线”来代表python里特殊方法专用的标识,如__init__0代表类的构造函数。类似__xxx__这样的变量一般是特殊变量,可以被直接引用,但是有特殊用途,而__name__就是这样一个特殊变量,它是python的一个内置类属性,它天生就存在于一个 python 程序中。
1.当我们直接运行python程序时,程序的__name__就是等于'__main__'
有程序脚本“A.py”,代码如下,
def myfun1():
print('从A中调用myfun1')
print('A_name:', __name__)
myfun1()
直接执行代码,得到结果输出:
2.当我们运行python程序导入其他.py文件时,导入其他文件的__name__就是等于模块名
除A.py外,我们有另一脚本run_code.py,我们使用它来调用A.py,此处我们直接import A即可
import A
我们看看输出:
可以看到输出的形式基本就是一致的,但不一样的是__name__不再等于'__main__'而是为文件名字“A”。
3 if __name__=='__main__'在项目的应用
值得注意的是,我们刚刚并没有使用A.py中的函数,只是import,python也会输出结果。让我们再次回顾我们的两个脚本:
A.py
def myfun1():
print('从A中调用myfun1')
print('A_name:', __name__)
myfun1()
run_code.py
import A
实际上,即使我们import A,同样也会把A的脚本执行。那么,如果我们在run_code.py脚本中调用函数会得到什么结果?我们把run_code.py修改如下:
import A
print('从run_code中调用myfun1')
A.myfun1()
输出结果如下:
接下来,我们分析每个输出的出处。
第一句及第二句输出,是由于import A过程中,执行A.py脚本中的“myfun1()”函数得到的,所以得到:
从A中调用myfun1
A_name: A
第三句输出,则是run_code.py脚本中的命令“print('从run_code中调用myfun1')”得到的输出
从run_code中调用myfun1
第四句及第五句输出,则是从run_code.py脚本中的命令“A.myfun1()”执行A中的“myfun1()”函数得到的输出
从A中调用myfun1
A_name: A
实际上,A.py这个文件本来只是一个函数文件,A.py中“myfun1()”这个命令,是我们在撰写这个函数的时候的测试命令,那么这就产生一个问题,当我们在其他程序中调用这个模块的时候,这一句测试内容就会被打印出来。
我们当然可以把上面的测试语句删除,但是一般情况下,我们后续可能还会对原始的代码进行修改,那么修改后,这些测试代码又要重新被添加上,那么就显得有点麻烦了。
那么在这种情况下,我们就可以在这些测试代码前加上:
if __name__ == '__main__':
根据我们前面讨论__name__的特性,就可以使得我们在测试的时候,运行测试语句,而当我们调用的时候,不再运行这些测试语句。
我们对A.py进行改写:
def myfun1():
print('从A中调用myfun1')
print('A_name:', __name__)
#myfun1()
if __name__ == '__main__':#当作为模块被导入时,不执行
myfun1()
执行输出结果有:
run_code.py不用修改。现在,我们再执行run_code.py
可以发现,测试的语句已经没有再被输出了。
4 总结
初始接触python的时候,我们往往困惑“if name == '__main__'”这句似乎没有任何作用的语句为什么要加上去。但是相信经过上面的讲解,大家也对python的模块管理有了更深刻的认识,也明白在实际使用中,我们该如何运用“if name == '__main__'”这个语句了。
刚接触Python,练习编写的程序/模块通常是直接运行,该语句没有起到实质性的作用。因此会对其作用有些困惑。有模块的概念,自己尝试做一些模块封装,就会很好理解了。
3.使用watch窗口添加关注变量
往期精彩回顾
适合初学者入门人工智能的路线及资料下载 (图文+视频)机器学习入门系列下载 机器学习及深度学习笔记等资料打印 《统计学习方法》的代码复现专辑 机器学习交流qq群955171419,加入微信群请扫码