首页 > 其他分享 >if__name == '__main__'的理解

if__name == '__main__'的理解

时间:2024-01-24 10:12:01浏览次数:26  
标签:__ myFunction name nameScript importingScript main

1、理解

在大多数编排得好一点的脚本或者程序里面都有这段if __name__ == 'main': ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与大家分享。

if __name__ == “__main__”: 本质就是一个if判断,但它又不是一个简单的if判断。

即当.py文件运行时,__name__ 是'__main__' 时运行下面if下的代码,则否不运行。

2、__name__是什么

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

当你直接执行一段脚本的时候,这段脚本的 __name__变量等于 ‘__main__'

当这段脚本被导入其他程序的时候,__name__ 变量等于脚本本身的名字

场景1:直接运行脚本

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

1 def myFunction():
2  print('The value of __name__ is ' + __name__)
3 
4 def main():
5  myFunction()
6 
7 if __name__ == '__main__':
8  main()

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

场景2:从其他脚本导入

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

1 import nameScript as ns
2 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 的作用域中的。

 

标签:__,myFunction,name,nameScript,importingScript,main
From: https://www.cnblogs.com/Zhouce/p/17983996

相关文章

  • 最小生成树
    生成树是指无向图中连通且n个顶点n-1条边的树。最小生成树就是构造连通图的最小代价的生成树。最小瓶颈树就是在树上最大的边权值在所有生成树中最小。那么有一个定理,最小生成树就是最小瓶颈树,但最小瓶颈树不一定是最小生成树。解决最小生成树有两种算法分别为:Prim(不常用)和......
  • 2024-01-24:用go语言,已知一个n*n的01矩阵, 只能通过通过行交换、或者列交换的方式调整矩
    2024-01-24:用go语言,已知一个n*n的01矩阵,只能通过通过行交换、或者列交换的方式调整矩阵,判断这个矩阵的对角线是否能全为1,如果能返回true,不能返回false。我们升级一下:已知一个n*n的01矩阵,只能通过通过行交换、或者列交换的方式调整矩阵,判断这个矩阵的对角线是否能全为1,如果......
  • adb命令补充---20240124
    1、如何查看系统是32位还是64位?adbshellgetpropro.product.cpu.abi---返回设备当前CPU的ABI版本号若结果包含"armv7-a"字样,则说明设备是32位;若结果包含"arm64-v8a"字样,则说明设备是64位。如何检测Android应用是32位还是64位?与32位系统不同的是,在64系统中会同时存在两个Zyg......
  • cannot import name ‘compare_ssim‘ 解读
    不能导入'compare_ssim'的解决方法当在Python中编写图像处理代码时,可能会遇到ImportError:cannotimportname'compare_ssim'的错误。这个错误通常是由于无法导入compare_ssim函数而引起的。本文将介绍导致此错误的可能原因,并提供解决方案。问题原因compare_ssim函数是用于计算结......
  • 聊聊x86计算机启动发生的事?
    大家好,我是呼噜噜,最近在看linux早期内核0.12的源码,突然想到一个困扰自己好久的问题:当我们按下电源键,计算机发生了什么?神秘地址0x7C00究竟是什么?操作系统又是如何被加载到硬件中的?带着这些问题,继续往下阅读本文。x86计算机启动过程,主要分为这几个阶段:BIOS自检,引导设备的选择,主引导......
  • 图论---可视区域获取(C++)
    1.开源库获取   地址:http://en.wikipedia.org/wiki/Visibility_graph2.使用使用处包含头文件 #include"visilibity.hpp"即可,以下面在Qt中使用为例:1/*2=========AVisiLibityExampleProgram=========3Thisprogramprovidesatextinterfacewhic......
  • 记一次linux复制病毒处理过程
    某天我的阿里云突然发信息告诉我服务器有自变异木马,我用远程工具连接服务器异常卡顿甚至掉线,reboot也不好使.用阿里云的网页控制台会好些,但还是卡,我又用阿里云控制台重启服务器,重启之后发现服务器完全连不上了,ping也ping不通了,我问了客服说可以用救援连接试试,果然能连上,......
  • 接口数据传递中的跨域问题
    跨域问题产生原因原因大部分浏览器自带的保护措施,限制用户在一个域名下请求另一个域名的数据一、关于跨域跨域对于前后端开发者来说,就像一块狗皮膏药,无论是面试还是开发中,都会经常遇到。之所以出现跨域问题,是因为浏览器的同源策略,为了隔离潜在的恶意文件,为了防御来自歪门邪......
  • linux安装与VMware安装
    Linux第一天1、为什么要学习linux?因为大数据中绝大部分核心组件都是基于linux操作系统运行的,企业中基本上都是linux系统。2、怎么去学linux?(什么是大数据)大数据技术组件hadoophivezookeeperhbasesparkflinkkafkarangerdolphineschedulereshudidoris....大数......
  • [整理参考] CMD/DOS下运算符号的作用
    因关于DOS符号的总结很少,所以根据[1],经过几次整理之后,写了下面这个《CMD/DOS符号参考》,推荐新手好好看看,老手温习。标题:[整理参考]CMD/DOS下符号的作用参考作者:lxmxn[at]bbs.cn-dos.net时间:2007-5-27邮箱:lxmxn520[at]163.com说明:1、转帖请注明原帖出处属于中国DOS联盟(www.cn-do......