关于Python中的if __name__ == __main__详情

 更新时间:2021年09月15日 11:00:49   作者:钱魏Way  
在学习Python的过程中发现即使把if __name__ == ‘__main__’ 去掉,程序还是照样运行。很多小伙伴只知道是这么用的,也没有深究具体的作用。这篇文字就来介绍一下Python中的if __name__ == ‘__main__’的作用,需要的朋友参考下文

关于在学习Python的过程中,遇到的这类似的代码:

if __name__ == "__main__":
    print("Hello World!")

1.程序入口

对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java,C# 等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始。同样,Java C# 必须要有一个包含 Main 方法的主类来作为程序入口。

Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

if __name__ == “__main__”: 本质就是一个if判断,但它又不是一个简单的if判断。即当.py文件运行时,__name__ 是'__main__' 时运行下面if下的代码,则否不运行。当然你也可以把代码写成这样:

if __name__ == "__main__":
    print("Hello World!")
else:
    print("Hello Mars!")


2.__name__是什么?

__name__Python内置的变量,它是每个 Python 模块必备的属性,但它的值取决于你是如何执行这段代码的。

当你直接执行一段脚本的时候,这段脚本的 __name__变量等于 ‘__main__'
当这段脚本被导入其他程序的时候,__name__ 变量等于脚本本身的名字

场景1:直接运行脚本

假设我们有一个nameScript.py,代码如下:

def myFunction():
    print('The value of __name__ is ' + __name__)


def main():
    myFunction()


if __name__ == '__main__':
    main()

直接执行这个文件后流程为:

在所有其他代码执行之前,__name__变量就被设置为 ‘__main__' 了。在此之后,通过执行 def 语句,函数 main() 和 myFunction() 的本体被载入。接着,因为这个 if 语句后面的表达式为真 true,函数 main() 就被调用了。而 main() 函数又调用了myFunction(),打印出变量的值'__main__'。

场景2:从其他脚本导入

如果你需要在其他脚本里重用这个 myFunction() 函数,比如在 importingScript.py 里,我们可以将 nameScript.py 作为一个模组导入。

importingScript.py 的内容如下:

import nameScript as ns

ns.myFunction()

这时,我们就有了两个不同的作用域:一个是 importingScript 的,一个是 nameScript 的:

importingScript.py ,__name__ 变量就被设置为 ‘__main__'。当导入 nameScript 的时候,Python 就在本地和环境变量 PATH 指向的路径中寻找对应名称的 .py 文件,找到之后,将会运行导入的文件中的代码。

但这一次,在导入的时候,它自身的 __name__ 变量就被设置为了 ‘nameScript',接下来还是一样,函数 main() myFunction() 的本体被载入。然而,这一次 if 语句后面的表达式结果为假 false,所以 main() 函数没有被调用。

导入完毕之后,回到 importingScript.py 中。现在 nameScript 模块中的函数定义已经被导入到当前的作用域中,于是我们通过 ns.myFunction() 的方式调用模块中的函数,这个函数返回的是模块内的变量的值 ‘nameScript'。

如果你试着在 importingScript 中打印 __name__ 变量的值,那当你直接执行 importingScript 的时候,它也会输出 ‘__main__'。原因在于,这个变量是在 importingScript 的作用域中的。

3.__name__可以显示包路径

我们建立这样一个目录结构:

a
├── b
│   ├── c.py
│   └── __init__.py
└── __init__.py
d.py


c.py文件中的代码:

print(__name__)


d.py文件中的代码:

from a.b import c


运行d.py文件,结果为:

a.b.c

此时a.py文件的__name__属性变成了a.b.c,完完全全反映了它所在的包路径。

5.测试模块里函数

由于一个脚本被引入时,自身的代码会被执行,因此我们在每个脚本里都写上一段if __name__ == ‘__main__': 如果你希望一些代码只有在脚本被直接执行时才执行,那么就把这些代码放入到if 语句块中,最常见的情形就是测试代码:

def safe_division(a, b):
    if b == 0:
        return None

    return a/b

if __name__ == '__main__':
    print(safe_division(10, 5) == 2)
    print(safe_division(10, 0) == None)

我们写完一个函数后,不免要写一些测试的代码,而这些测试的代码我们不希望他们在引入时执行,只有当我们主动执行进行测试才执行这些测试代码。

到此这篇关于关于Python中的if __name__ == ‘__main__'详情的文章就介绍到这了,更多相关Python中的if __name__ == ‘__main__'内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python的进程间通信详解

    Python的进程间通信详解

    大家好,本篇文章主要讲的是Python的进程间通信详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Python中快速掌握Data Frame的常用操作

    Python中快速掌握Data Frame的常用操作

    这篇文章主要介绍了Python中快速掌握Data Frame的常用操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • python模式 工厂模式原理及实例详解

    python模式 工厂模式原理及实例详解

    这篇文章主要介绍了python模式 工厂模式原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 小结Python的反射机制

    小结Python的反射机制

    这篇文章主要介绍了Python的反射机制,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-09-09
  • 一篇文章带你搞懂Python类的相关知识

    一篇文章带你搞懂Python类的相关知识

    今天我们要说的是面向对象的核心-----类,类能帮我们把复杂的事情变得有条理,有顺序,希望大家通过学习类能改善自己的编码风格,使代码变得更为好看,更加通俗易懂,需要的朋友可以参考下
    2021-05-05
  • 利用Python+Selenium破解春秋航空网滑块验证码的实战过程

    利用Python+Selenium破解春秋航空网滑块验证码的实战过程

    本文给大家介绍使用Python+Selenium破解春秋航空网滑块验证码的实战过程,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • Python教程之成员和身份运算符的用法详解

    Python教程之成员和身份运算符的用法详解

    身份运算符是python用来判断的两个对象的存储单元是否相同的一种运算符号。Python的成员运算符是“是否包含运算符”,主要应用在字符串或者集合中。本文将通过示例聊聊二者的使用,需要的可以参考一下
    2022-09-09
  • Python3实现发送邮件和发送短信验证码功能

    Python3实现发送邮件和发送短信验证码功能

    这篇文章主要介绍了Python3实现发送邮件和发送短信验证码功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • python扫描proxy并获取可用代理ip的实例

    python扫描proxy并获取可用代理ip的实例

    下面小编就为大家带来一篇python扫描proxy并获取可用代理ip的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • python递归下载文件夹下所有文件

    python递归下载文件夹下所有文件

    这篇文章主要为大家详细介绍了python递归下载文件夹下所有文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08

最新评论