探究为什么Python不需要“main”函数

2020-07-22 00:09:17

许多语言通过调用必须具有特定名称的函数来开始运行您的程序。在C语言(以及许多C派生语言)中,这只称为main();在Go中,它是它的main.main()(主包中的main()函数)。众所周知,Python不需要任何这样的函数,即使您创建了一个名为main()的函数,它也不会自动调用。最近我读到“为什么Python没有主函数?”(VIA),其中提出了一个关于为什么会这样的讨论。然而,我有一种稍微不同的方式来解释这种情况。

Python不需要main()函数的核心原因是它的执行模型(特别是针对导入时发生的情况)的组合,而且在正常情况下,您可以通过(隐式)导入单个Python代码文件来启动Python程序。因此,让我们来看看这些部分的每一个部分。

在许多语言中,函数、类等东西是由解释器或编译器在解析源文件时重新创建(定义)的。在Python中,情况并非如此;相反,defand class是可执行语句,它们在执行时定义类和函数(其中,这是元类工作的部分原因)。当Python导入某些内容时,它只是执行文件中的所有内容(或者更一般的导入)。当执行的是defand class语句时,您将获得函数和类。当执行的是常规代码时,会发生更复杂的事情,包括条件导入或在正确条件下动态调用函数。或者,您可以编写一个完整的程序,在导入文件时内联运行。

然而,Python在这里并不像看起来那么独特。在程序开始正常执行之前(例如,go有init()函数),许多语言都有一些工具可以在程序开始加载之前运行任意代码。Python与这些语言的不同之处在于,Python通常通过加载和执行特定的单个文件来启动程序。因为Python只执行一个文件,所以它清楚地知道什么代码以什么顺序运行,并且该文件中的代码很容易控制发生的事情。在某种意义上,Python可以通过让您提供一个任意命名的文件来偷偷地选择一个任意命名的文件,而不是选择一个任意命名的函数作为(名义上)执行的开始位置。

(编译语言传统上有一种模型,在该模型中,来自一堆单独文件的代码全部堆叠在一起。在Python中,您可以通过这种方式将多个文件聚合到一个共享名称空间中;无论如何,您必须导入它们,所有内容都从某个初始文件开始。)。

这个很好的模型出现故障并需要解决的地方是,如果您运行的包带有python-m...&39;,其中Python实际上没有您正在执行的单个文件(否则它必须使__init__.py具有双重功能)。正如官方文档s__main__-顶级脚本环境(VIA)中所述,Python采用任意约定,从包中加载__main__.pyfile,并或多或少地将其声明为执行起始点。

PS:与最初文章的观点相反,我强烈建议您使用main()函数,因为保持您的程序可导入有很大的好处。