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函数将返回结果。