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

作者:钱魏Way 时间:2022-05-04 10:16:28 

目录
  • 1.程序入口

  • 2.__name__是什么?

    • 场景1:直接运行脚本

    • 场景2:从其他脚本导入

  • 3.__name__可以显示包路径

    • 5.测试模块里函数

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

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

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

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

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

      关于Python中的if __name__ == __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 的:

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

      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)

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

      来源:https://www.tuicool.com/articles/meEnMnr

      标签:Python,if,name,==‘,main,’
      0
      投稿

      猜你喜欢

    • python 对类的成员函数开启线程的方法

      2021-09-11 17:12:42
    • python 实现自动远程登陆scp文件实例代码

      2022-04-02 20:25:31
    • 对numpy中轴与维度的理解

      2022-03-20 11:58:33
    • python opencv鼠标画点之cv2.drawMarker()函数

      2021-11-28 18:34:40
    • Python可变参数用法实例分析

      2022-01-20 04:24:55
    • OpenCV实现背景分离(证件照背景替换)

      2023-04-18 19:41:22
    • Python基于多线程实现抓取数据存入数据库的方法

      2024-01-22 12:36:34
    • 浅谈MySQL 亿级数据分页的优化

      2024-01-23 18:09:57
    • Python如何将控制台输出另存为日志文件

      2023-11-27 03:09:55
    • python使用reportlab实现图片转换成pdf的方法

      2021-09-24 22:32:26
    • 简单了解Django应用app及分布式路由

      2023-08-30 19:29:47
    • Python的索引与切片原来该这样理解

      2023-11-21 16:17:51
    • pytorch visdom安装开启及使用方法

      2023-11-27 06:39:41
    • 使用Numpy打乱数组或打乱矩阵行

      2022-09-18 09:40:10
    • sql查询一个数组中是否包含某个内容find_in_set问题

      2024-01-23 19:55:12
    • 采用XML数据来填充ASP表单

      2008-05-04 13:32:00
    • 在Pycharm中对代码进行注释和缩进的方法详解

      2023-09-27 23:55:26
    • JavaScript对象学习经验整理

      2024-04-17 10:09:50
    • ASP利用TCPIP.DNS组件实现域名IP查询

      2010-02-26 11:25:00
    • 详解Python中元组的三个不常用特性

      2021-09-02 05:49:35
    • asp之家 网络编程 m.aspxhome.com