Python 中的 _name_ _main_

2024 年 8 月 29 日 | 阅读 3 分钟

在 C 语言家族(C、C++、Java、C# 等)开发的程序中,需要 **main() 函数** 来指定程序的执行入口。

然而,由于 **Python 是一种解释型语言**,并且可以用于交互式 shell,因此它 **没有 main() 方法**。多个语句可以包含在 **.py 扩展名的 Python 程序文件中**。**Python 程序文件的第一个语句** 是执行的开始处。

Python 解释器在执行代码之前会分析源文件并定义一些特殊变量/全局变量。如果该模块(源文件)**被执行为主要应用程序**,Python 解释器会将特殊变量 **__name__** 的值设置为 **"__main__"**。如果同一个文件从另一个模块被引用,**__name__** 将被设置为 **模块的名称**。**__name__ 全局变量** 接受模块名作为值。

包含 **Python 定义和语句的文件** 称为模块。带有 **.py** 扩展名的模块名称成为文件名。

示例

输出

Executed Always
It is executed when it's invoked directly

解释

**第一层缩进 [块 1] 的整个代码块将被执行**。尽管指定的函数和类都已定义,但**它们的代码实际上都不会执行**。

正如我们在这里遵循的指示。Python 将直接使用 **__main__ 变量**。因此,**if 块 [块 2] 中的代码** 将仅在该模块充当你的**程序入口点**时执行。

因此,通过检查 **__name__ 变量**,你可以确定你的脚本是**手动执行的,还是被另一个程序导入的**。

如果脚本被另一个模块导入,则该模块的**名称将是 __name__。

为什么需要它?

通常,当我们想要**直接执行一个函数**时,它就是必需的。例如,**我们正在创建一个脚本**,该脚本将被用作一个模块。

示例

输出

I'm inside this function

使用 __name__ == "__main__" 的优点

  • 每个 Python 模块都有一个指定的 **__name__**,如果它是 '__main__',则表示该模块**被用户独立执行**,允许我们采取必要的行动。
  • 如果你将此脚本作为模块在另一个脚本中引用,则 **__name__ 会被赋为脚本/模块的名称**。
  • Python 文件可以充当**独立应用程序**或**可重用模块**。
  • 如果文件被直接执行,而没有被导入,那么 **"if __name__ == "main""** 语句用于运行一些代码。

为什么设计成这样?

自然,我们可能会思考**设计的理由**。好吧,有时我们希望**创建一个 .py 文件**,该文件既可以被**其他程序和/或模块用作模块**,也可以作为**主应用程序本身**。

这种行为有助于我们**更快地测试和改进代码**。由于它允许我们**直接在脚本模式下运行单元测试**,因此也有助于**调试**。

此外,只需设置一个变量就可以**直接启动 Python 模块**,这一点很巧妙。

结论

无论你需要一个可以被其他模块导入的文件,还是一个可以作为主程序启动的文件,**__name__ 变量**都有一个特别好的用例。当模块被导入时,我们可以使用 **if __name__ == "__main__"** 块来允许或禁止运行特定代码段。

每当 **Python 解释器读取任何文件**时,**__name__** 变量就会被设置为**导入的**模块的名称,或者在模块被启动时设置为 **__main__**。**读取文件时会执行所有顶层代码**,但**函数和类不会**(因为它们只会被导入)。

通过利用顶层作用域 **__main__** 和特殊变量 **__name__**,**可重用性得到了提高**。Python 脚本文件既可以独立运行,也可以作为模块导入,并且可以从**命令行或终端**运行。