在解释任何有关if __name__ == '__main__'
它的内容之前,重要的是要了解它是什么__name__
以及它做什么。
什么__name__
啊
__name__
是DunderAlias-可以认为是全局变量(可从模块访问),并且与相似global
。
它是type(__name__)
(yielding <class 'str'>
)指示的字符串(如上所述),并且是Python 3和Python 2版本的内置标准。
哪里:
它不仅可以在脚本中使用,而且可以在解释器和模块/包中找到。
口译员:
>>> print(__name__)
__main__
>>>
脚本:
test_file.py:
print(__name__)
导致 __main__
模块或包装:
somefile.py:
def somefunction():
print(__name__)
test_file.py:
import somefile
somefile.somefunction()
导致 somefile
请注意,在包或模块中使用时,使用__name__
文件名。没有给出实际模块或包路径的路径,但是具有自己的DunderAlias__file__
,因此可以这一点。
您应该看到,where __name__
,它总是在其中返回主文件(或程序)__main__
,并且如果它是一个模块/程序包,或者正在运行其他Python脚本的任何东西,则将在其中返回文件名。起源于。
实践:
作为变量意味着它的值可以被覆盖(“可以”并不意味着“应该”),覆盖的值__name__
将导致缺乏可读性。因此,无论出于任何原因都不要这样做。如果您需要一个变量,请定义一个新变量。
始终假定__name__
为be 的值__main__
或文件名。再次更改此默认值将引起更多混乱,这会带来好处,并进一步导致问题。
例:
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
通常,将if __name__ == '__main__'
in 包含在脚本中被认为是一种好习惯。
现在回答if __name__ == '__main__'
:
现在我们知道__name__
事物的行为变得更加清晰:
一个if
是包含的代码块,如果给定的值是true,将执行流控制语句。我们已经看到这__name__
可以采取
__main__
导入的文件名导入的文件名。
这意味着,如果__name__
等于,__main__
则该文件必须是主文件并且必须实际上正在运行(或者它是解释器),而不是导入脚本的模块或包。
如果确实__name__
采用了值,__main__
那么该代码块中的所有内容都将执行。
这告诉我们,如果正在运行的文件是主文件(或者直接从解释器运行),则必须执行该条件。如果它是一个包,则不应该,并且值不应该是__main__
。
模块:
__name__
也可以在模块中使用以定义模块名称
变体:
也可以使用进行其他一些不太常见但有用的事情__name__
,我将在这里展示一些:
仅当文件是模块或软件包时才执行:
if __name__ != '__main__':
# Do some useful things
如果文件是主文件,则运行一个条件,如果文件不是主文件,则运行另一个条件:
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
您也可以使用它在软件包和模块上提供可运行的帮助功能/实用程序,而无需精心使用库。
它还允许模块作为主脚本从命令行运行,这也非常有用。
if __name__ == "__main__":
到Python 3为止,块条件是否已经过时/过时了?我发现一些信息说明了这一点。