何时以及如何在 Python 中执行 main 方法呢?
如果您是 Python 新手,您可能已经注意到可以在有或没有 main 方法的情况下运行 Python 脚本。并且 Python 中用于定义一个(即if name == ‘__main__')的符号绝对不是不言自明的,尤其是对于新手而言。
在今天的教程中,我们将探讨和讨论 main 方法的用途,以及在 Python 应用程序中定义该方法时的预期结果。
__name__的目的是什么?
在执行程序之前,Python 解释器将 python 模块的名称分配给一个名为__name__. 根据您是通过命令行执行程序还是将模块导入另一个模块,分配__name__将有所不同。
例如,如果您将模块作为脚本调用:
python my_module.py
然后 Python Interpreter 会自动将字符串分配'main'给特殊变量__name__。另一方面,如果您的模块是在另一个模块中导入的。
# Assume that this is another_module.py
import my_module
然后字符串'my_module'将被分配给__name__.
主要方法是如何工作的?
现在假设我们有以下模块,其中包含以下代码行:
# first_module.py
print('Hello from first_module.py')
if __name__ == '__main__':
print('Hello from main method of first_module.py')
所以在上面的模块中,我们有一个在 main 方法之外的打印语句和一个在内部的打印语句。main 方法下的代码只有在模块作为脚本从(例如)命令行调用时才会执行,如下所示:
python first_module.py
Hello from first_module.py
Hello from main method of first_module.py
现在,假设我们不想将模块first_module作为脚本调用,而是想将其导入另一个模块:
# second_module.py
import first_module
print('Hello from second_module.py')
if __name__ == '__main__':
print('Hello from main method of second_module.py')
最后,我们second_module作为脚本调用:
python second_module.py
Hello from first_module.py
Hello from second_module.py
Hello from main method of second_module.py
请注意,第一个输出来自模块first_module,特别是来自 main 方法之外的打印语句。由于我们没有first_module作为脚本调用,而是将其导入到second_modulefirst_module 的 main 方法中,因为if name == ‘__main__'计算结果为False. 回想一下,从上面的调用中,__name__变量 forsecond_module被分配了字符串'main',而first_module's__name__变量被分配了模块的名称,即’first_module’。
尽管下面的所有内容都if name == ‘__main__'被认为是我们所说的“main 方法”,但最好定义一个适当的 main 方法,如果条件评估为 True 则调用该方法。例如,
# my_module.py
def main():
"""The main function of my Python Application"""
print('Hello World')
if __name__ == '__main__':
main()
注意:我通常不鼓励您在单个 Python 应用程序中拥有多个主要功能。为了这个例子,我使用了两种不同的主要方法。
最后的想法
在本文中,我描述了 main 方法如何在 Python 中执行以及在什么条件下执行。当一个模块作为一个字符串被调用时,Python 解释器会将这个字符串分配'main'给一个名为 call 的特殊变量,随后将执行__name__在该条件下定义的代码。if name == ‘__main__'另一方面,当一个模块被导入到另一个模块中时,Python 解释器会将带有该模块名称的字符串分配给特殊变量__name__。这意味着在这种情况下if name == ‘__main__'将评估为False这意味着只有在这种情况之外的代码才会在导入后执行。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理