在Python中的_name_ _main_
main()函数 在使用C系列语言(如C、C++、Java、C#等)开发的程序中是必需的,用于指定程序应该从哪里开始执行。
然而,因为 Python是一种基于解释器的语言 可以在交互式shell中使用,它没有主()方法。可以在 .py扩展的Python程序文件中找到多个语句 。Python程序文件的第一条语句是执行开始的地方。
Python解释器在运行代码之前会分析源文件并定义一些特殊变量/全局变量。如果该模块(源文件)作为主应用程序 运行时,Python解释器将特殊变量__name__
设置为值”__main__
“ 。如果同一文件从另一个模块中提取,则__name__
将设置为 模块的名称 。全局变量 __name__
接受模块名作为值。
包含 Python中的定义和语句的文件 被称为模块。带有 .py 扩展名的模块成为文件名。
示例:
# Python program to demonstrate the execution of
# main directly
print ("Executed Always")
if __name__ == "__main__":
print ("It is executed when it's invoked directly")
else:
print ("It is Executed when it's imported")
输出:
Executed Always
It is executed when it's invoked directly
解释:
这整个代码块 在0级缩进的[块1]被运行 。虽然指定的函数和类都被定义了, 但它们的代码实际上并没有执行 。
根据这里的指示,Python将直接使用 __main__
变量 。因此,只有在该模块作为您的 程序入口点时,才会执行此 [块2] 的代码 。
因此,通过检查 __name__
变量 ,您可以确定脚本是手动执行的, 还是被另一个程序导入的 。
如果脚本被另一个模块导入 ,此时模块的 名称将为__name__
。
为什么需要这个
通常在我们想要 直接执行一个函数时 需要它。例如, 我们正在创建一个脚本 ,它将被用作一个模块:
示例:
# Python program to demonstrate the execution of a
# function directly
def this_function():
print ("I'm inside this function")
# We can test this function by calling it.
this_function()
输出:
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脚本文件可以在命令行或终端上从命令行或终端运行,无论是独立运行还是作为模块导入运行。