社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

机器学习初学者 • 2 年前 • 296 次点击  

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窗口添加关注变量

往期精彩回顾




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/148843
 
296 次点击