我们写代码的时候,经常会用到if __name__ == "__main__"
它的使用背后的机制、它的优点、以及它可以用在什么地方
一、__name__
属性和__main__
范围
__name__
属性默认为当前局部范围内的一个名字。
当我们运行一个 Python 脚本或将我们的代码作为一个模块导入时,Python 解释器会自动添加这个值。
在你的 Python 解释器上试试下面的命令。你可能会发现 __name__
属于 dir()
的属性列表:
print(dir())
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
Python 中的 __name__
是一个特殊的变量,它定义了类的名称或当前模块的名称,或被调用的脚本的名称。
创建一个名为 name_scripts
的新文件夹,这样我们就可以写一些脚本来了解这一切是如何工作的。
在该文件夹中创建一个新文件,script1.py,代码如下:
print(f'The __name__ from script1 is "{__name__}"')
你会发现 ,最终的输出如下:
The __name__ from script1 is "__main__"
默认情况下,当一个脚本被执行时,解释器会读取该脚本并将字符串 __main__
赋值给 __name__
关键字。
所以,当我们直接在命令行下执行脚本时,添加if __name__ == "__main__"
就会执行当前脚本代码。
当上面的脚本被导入到另一个脚本中时,情况变得更加有趣。考虑一个名为 script2.py 的 Python 文件,其代码如下:
import script1
print(f'The __name__ from script2 is "{__name__}"')
输出结果为:
The __name__ from script1 is script1
The __name__ from script2 is "__main__"
可以看到,当脚本被执行时,输出结果是以script1的形式表示脚本的名称。最后的打印语句是在 script2 的范围内,当它被执行时,输出被打印为:__main__
。
现在我们理解了 Python 是如何使用 __name__
作用域的,以及当它给它一个__main__
的值时,让我们看看为什么我们在执行代码前要检查它的值。
二、if __name__ == "__main__"
作用
我们使用 if语句来运行代码块,只有当我们的程序是被执行的主程序时。这使得我们的程序本身可以执行,但对其他可能想导入某些功能的Python模块很友好,而不必运行代码。
考虑一下下面的Python程序:
script3.py包含一个叫做add()的函数,它只从主环境中被调用:
def add(a, b):
return a+b
if __name__ == "__main__":
print(add(2, 3))
由于脚本被直接执行,__name__
关键字被分配给__main__
,并且在if __name__ == "__main__"
条件下的代码块被执行。
这是在命令行下执行的结果,加入我们直接导入的话会怎么样呢?
import script3
print(f"{script3.__name__}")
输出结果为:
script3
script3.py 中 if __name__ == "__main__"
下的块没有执行,和预期的一样。
这是因为 __name__
关键字现在被赋予了脚本的名称:script3。
三、使用场景
简单概括一下if __name__ == "__main__"
的使用场景:
- 测试过程中,为了保证代码正常运行,且这个代码需要被导入到另外一个脚本时,在这种情况下,我们通常不希望该脚本作为主模块运行。这样,就可以在导入和命令行测试情况下会有不同的执行和结果。
- 创建一个库,但希望为用户做一个演示或其他特殊的运行时情况。通过使用这个 if 语句,使用你的代码作为库的 Python 模块就不会受到影响
网友评论