纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

钱魏Way   2021-09-15 我要评论
想了解关于Python中的if __name__ == __main__详情的相关内容吗钱魏Way在本文为您仔细讲解Python中的if __name__ == __main__的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Python中的if,__name__,==,‘__main__’下面大家一起来学习吧

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

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

1.程序入口

对于很多编程语言来说程序都必须要有一个入口比如 CC++以及完全面向对象的编程语言 JavaC# 等如果你接触过这些语言对于程序入口这个概念应该很好理解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)

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


相关文章

猜您喜欢

  • java多线程和线程池 一文彻底搞懂java多线程和线程池

    想了解一文彻底搞懂java多线程和线程池的相关内容吗hguisu在本文为您仔细讲解java多线程和线程池的相关知识和一些Code实例欢迎阅读和指正我们先划重点:java常用的线程池,java多线程线程池,java线程池实现下面大家一起来学习吧..
  • SpringBoot启动@Order注解 基于SpringBoot开机启动与@Order注解

    想了解基于SpringBoot开机启动与@Order注解的相关内容吗总是幸福的老豌豆在本文为您仔细讲解SpringBoot启动@Order注解的相关知识和一些Code实例欢迎阅读和指正我们先划重点:SpringBoot开机启动,@Order注解下面大家一起来学习吧..

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式