【Python】if name == '__main__'究竟有什么作用?

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

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

c7d05660c1133bede9438ad68b98d849.png
image-20220618195714681

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

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

import A

我们看看输出:

ccfbecab37df98d97663b33b675a4487.png
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()

输出结果如下:

06bcae555ca0ab94b39eb68cc5bf0832.png
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()

执行输出结果有:

ec00d5fe1256c0a84f04ce5f8d744f72.png
image-20220618222222096

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

28172d6472e7fb37b007b36df782a6ec.png
image-20220618222253868

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

4 总结

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

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

a9df3da103f1df472f37339e220985d3.jpeg

往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码

af45384fb42d6c4c6a37506d51d2b0b9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值