Python 什么是if __name__ ==

Python 什么是if __name__ ==

这篇文章解释了Python代码表达式 if __name__ == '__main__' 的含义。

一个Python程序使用条件if __name__ == '__main__'来在程序直接被Python解释器运行时,只运行if语句内的代码。当文件的代码作为模块导入时,不会执行if语句内的代码。

什么是__main__

在Python中,__name__是一个独特的变量。

Python有很多以双下划线开始和结束的特殊变量,为了简略起见称之为“dunder”(来自Double Underscores的缩写)。在这种情况下,__name__发音为“dunder name”。

让我们使用Python shell来确定__main__的值-

>>> __name__
'__main__'

所以,__name__的值是__main__

让我们尝试导入一个Python模块,看看分配给该模块的__name__变量的值 –

>>> import random
>>> random.__name__
'random'

所以,导入了 random模块 之后,我们可以看到__name__的值是’random’,这实际上就是它的名字。

Python __name__变量的值

编写以下代码并将其放入文件main.py中 −

print(" __name__ value is {}".format(__name__))

使用字符串格式化方法输出__name__值的单个打印命令。

当我们通过引用Python文件直接运行代码时,__name__的值为__main__

$ python __name__main.py 
The value of __name__ is __main__

相反,如果我们通过Python shell导入模块的话,__name__的值为main –

>>> import _name_main
__name__ value is __name__main

所以,__name__的值根据我们的Python代码的执行方式而变化。

__name__的示例

要在Python中使用条件if __name__ == "__main__",可以创建以下示例Python程序,其中调用了三个不同的函数。

def step1():
   print("Executing the first step...")
def step2():
   print("Executing the second step...")
def step3():
   print("Executing the third step...")
step1()
step2()
step3()

输出

下面是上述代码的输出:

Executing the first step...
Executing the second step...
Executing the third step...

让我们想象一个不同的Python应用程序需要使用step1函数()。我们需要将我们的文件作为模块导入以实现这一目的。

当我们这样做时,发生的情况如下 –

>>> import _name_main
Executing the first step...
Executing the second step...
Executing the third step...
>>> _name_main.step1()
Executing the first step...

在导入模块后,可以调用step1()函数。问题是,当我们导入模块时,以下三行代码会自动执行:

step1()
step2()
step3()

现在的问题是-我们如何防止这种情况发生?

在导入模块时检查__name__是否等于__main__

我们可以验证__name__的值是否等于“__main__”,以阻止在前一节中看到的行为发生。

这样,只有在直接调用Python文件时,if条件内的代码才会被运行,而不是在作为模块导入时运行。

示例

现在,程序是 −

def step1():
   print("Executing the first step...")
def step2():
   print("Executing the second step...")
def step3():
   print("Executing the third step...")
if __name__ == "__main__":
   step1()
   step2()
   step3()

输出

让我们检查一下直接调用Python程序是否仍然会调用这三个函数。

Executing the first step...
Executing the second step...
Executing the third step...

此外,当我们将其作为模块导入时,这三个函数不会被执行。

>>> import _name_main
>>> _name_main.step1()
Executing the first step...

这次要好得多!

考虑到_name_main模块拥有数百个函数,并不是你都想要导入的。

如何简单地导入step1()函数?

应该使用以下语法——

>>> from _name_main import step1
>>> step1()
Executing step1...
>>> step2()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'step2' is not defined

正如你所看到的,在这个例子中,我们只导入了函数step1的成功版本。

当我们尝试运行step2()时,出现NameError: name’step2′ is not defined的错误。

Python中的主方法

在像Java或C这样的语言中,main的概念非常常见,用于指定程序执行的起始点。

main()函数在Python中经常使用,在if语句内执行并验证__name__变量的值。

为了得到某个特定的结果,main()函数中调用了多个函数。在我们的情况下,主函数会调用三个子函数 –

示例

def step1():
   print("Executing the first step...")
def step2():
   print("Executing the second step...")
def step3():
   print("Executing the third step...")
def main():
   step1()
   step2()
   step3()
if __name__ == "__main__":
   main()

输出

Executing the first step...
Executing the second step...
Executing the third step...

由于main函数的概念在其他开发人员中也广为人知,所以将函数main()指定为标准命名约定,可以提高程序的可读性。

实际上,没有什么能阻止我们将主函数重命名为其他名称。

在继续本文之前,请验证我们修订后的代码在以下两种情况下是否正常运行:

  • 直接执行代码
  • 导入该模块

__name____main__和Python中的参数

当变量__name__的值等于"__main__"时,我们可以在if条件中处理调用Python程序时传递的任何参数。

我们可以使用 sys模块 来处理程序传递的参数。

  • 导入 sys模块 。

  • 创建一个名为main()的函数,该函数仅接受一个参数。此参数将由一个包含程序执行时传递的参数的字符串列表组成。

  • 在if语句的一部分中,检查__name__变量的值,并将 sys.argv 传递给main()函数。

示例

import sys
def main(args):
   print(args)
if __name__ == "__main__":
   main(sys.argv)

输出

以下是上述执行的程序的输出结果−

['main.py']

就像你所看到的那样,Python程序的第一个参数是.py文件本身的名称。

让我们修改主方法使其打印出args变量的类型。

def main(args):
   print(type(args))
   print(args)

这证明了args是一个列表 –

$ python arguments.py arg1 arg2
<class 'list'>
['arguments.py', 'arg1', 'arg2']

除了提供参数外,我们还可以解压程序所需的参数,但排除程序的名称−

import sys
def main(c, d):
   return int(c) * int(d)
if __name__ == "__main__":
   arg1, arg2 = sys.argv[1:3]
   print(main(arg1, arg2))

这是我们执行程序所采取的步骤以及我们得到的结果 –

$ python product.py 4 5
20

该代码使用 切片运算符 获取命令行中给定的两个数字。这两个数字在还是字符串格式的情况下被传递给main()方法。

将这两个数字转换为整数后,main函数将返回结果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程