【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()

直接执行代码,得到结果输出:

image-20220618195714681

2.当我们运行python程序导入其他.py文件时,导入其他文件的__name__就是等于模块名

除A.py外,我们有另一脚本run_code.py,我们使用它来调用A.py,此处我们直接import A即可

import A

我们看看输出:

image-20220618220705785

可以看到输出的形式基本就是一致的,但不一样的是__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()

输出结果如下:

image-20220618221205979

接下来,我们分析每个输出的出处。

第一句及第二句输出,是由于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()

执行输出结果有:

image-20220618222222096

run_code.py不用修改。现在,我们再执行run_code.py

image-20220618222253868

可以发现,测试的语句已经没有再被输出了。

4 总结

初始接触python的时候,我们往往困惑“if name == '__main__'”这句似乎没有任何作用的语句为什么要加上去。但是相信经过上面的讲解,大家也对python的模块管理有了更深刻的认识,也明白在实际使用中,我们该如何运用“if name == '__main__'”这个语句了。

刚接触Python,练习编写的程序/模块通常是直接运行,该语句没有起到实质性的作用。因此会对其作用有些困惑。有模块的概念,自己尝试做一些模块封装,就会很好理解了。


3.使用watch窗口添加关注变量

往期精彩回顾




浏览 51
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报