Python 中的__main__和__name__
用 C 族语言(C、C++、Java、C# 等)编写的程序。)需要main()
功能来指示执行的起点。
另一方面,在 Python 中,没有main()
函数的概念,因为它是一种基于解释器的语言,同样可以在交互 Shell中使用。 扩展名为.py
的 Python 程序文件包含多个语句。Python 程序文件的执行从第一条语句开始。
Python 包含名为__name__
的特殊变量,该变量包含作为字符串执行的代码的范围。__main__
是顶层代码执行的顶层作用域的名称。
例如,解释器 Shell 中执行的代码的范围将是__main__
,如下所示。
Python Shell
所有的功能和模块都将在解释器 Shell 的顶层范围__main___
内执行。
Python Shell
甚至内部功能都是在顶层范围__main__
内执行的:
Python Shell
一个 Python 文件可以包含多个可以独立执行的函数和语句。例如,考虑以下addition.py
:
addition.py
Python 程序文件可以通过以下方式执行:
-
使用命令提示符/终端将 Python 文件作为脚本执行。
-
使用 Import 语句将 Python 代码从一个文件导入到另一个文件
可以看到,顶层范围__main__
下执行的addition.py
。
addition.py
文件可以作为模块在另一个文件中使用,也可以通过导入在交互 Shell 中使用。
让我们看看当你在交互 Shell 中导入addition
模块时会发生什么。
Python Shell
上面,导入语句从第一条语句开始执行。但是,我们只想使用add()
方法,不想执行其他语句。
这里我们可以使用特殊变量__name__
来检查addition.py
文件的作用域和执行语句,只有当它从命令提示符/终端独立执行时,而不是当它被导入到其他文件/模块中时。 重写addition.py
,如下图。
addition.py
以上,if 条件检查如果范围是__main__
,那么只执行接受用户输入并添加它们的代码。
现在,让我们看看当我们在交互 Shell 中导入上面的addition
模块时会发生什么。
Python Shell
也可以使用from import
语句,如下所示:
Python Shell
如您所见,因为我们使用了一个 if 条件来检查作用域,所以它在导入addition
模块后不会执行用户输入的代码,因为它是在模块的作用域下执行的,也就是addition
作用域。 只进口add()
法。在其他模块中导入addition
模块也会发生同样的情况。
现在,让我们看看当您从命令提示符/终端执行它时会发生什么。
可以看到,由于addition.py
是在顶级范围__main__
内执行的,所以还是执行同样的代码。
因此,name
的值允许 Python 解释器确定模块是否是可执行脚本。如果其值为main
,将执行函数定义之外的语句。如果没有,模块的内容将被填充到顶层模块(或解释器名称空间)中,而不包含可执行部分。
注意:从命令提示符/终端执行的 Python 脚本文件将在顶层作用域__main__
作用域下执行。但是,导入模块将在模块自己的范围内执行。因此,顶层范围将是__main__
,第二个范围将是模块的范围。
因此,使用特殊变量__name__
和顶级范围__main__
增加了可重用性。Python 脚本文件可以作为独立脚本从命令提示符/终端执行,也可以作为模块导入。