共计 1995 个字符,预计需要花费 5 分钟才能阅读完成。
毫无疑问 Python 中没有所谓的 main 入口函数,然而网上常常看到一些文章提“Python 的 main 函数”、“倡议写 main 函数”……
有些人是知情的,他的用意可能是模拟那些正宗的 main 函数,但还有不少人显著是被误导了(或本人误会了),就写进去很累赘的代码。
本期“Python 为什么”栏目来聊聊 Python 为什么没有 main 函数?
在开始正题之前,先要来答复这两个问题: 所谓的“main 函数”是指什么?为什么有些编程语言须要强制写一个 main 函数?
某些编程语言以 main 函数作为程序的执行入口,例如 C/C++、C#、Java、Go 和 Rust 等,它们具备特定的含意:
- main 函数名是强制的,也就是要求必须有一个 main 函数
- main 函数最多只能有一个,也就是说程序的入口是惟一的
- 语法格局有肯定的要求,具备绝对固定的模板
为什么要强制一个 main 入口函数呢?
这些语言是编译型语言,须要把代码编译成可执行的二进制文件,为了让操作系统 / 启动器找到程序的终点,所以要约定这一个函数。简略地说,就是在一大堆代码里,须要定义一个显著的可用于执行的结尾。
不难看出,main 函数是那些语言中重要而不可缺的有机组成部分。
然而,咱们再来看看 Python,状况就大不相同了。
- Python 是解释型语言,即脚本语言,运行过程是从上往下,逐行解析运行,也就是说它的终点是可知的
- 每个 .py 文件就是一个可执行文件,都可作为整个程序的入口文件,也就是说程序的入口是灵便可变的,没有必须恪守的约定
- 有时候运行 Python 我的项目,并没有指定入口文件(命令行中较常见,例如 ”python -m http.server 8000″),那可能是存在 __main__.py 文件,它所在的包被当成一个“文件”来执行了
归纳起来,意思是说 Python 这种脚本语言跟编译型语言不同,它不论是在单个模块层面(即一个 .py 文件),还是在由多个模块组成的包层面,都可抉择灵便的执行形式,不像其它语言缺了约定好的入口就没法执行。
也就是说,Python 没有必要在语法层面规定程序员必须定义出一个对立的入口(不论是函数还是类还是什么货色)。
有些同学可能会有纳闷,因为他们常常看到或者本人写出上面这样的代码:
# main 里是某些主体代码
def main():
……
if __name__ == '__main__':
main()
难道这不就是 Python 的 main 函数么?置信有不少同学会这么想!
非也!非也!
除了函数名是“main”以外,它跟咱们后面介绍的正统的 main 函数没有半毛钱关系,既没有强制性,也没有必然决定程序执行程序的作用。短少它,也不会导致什么语法问题。
之所以有些知情人要命名出一个”main“函数,其实是想强调它的”次要“位置,想要人为地安顿它作为第一个执行的函数。他们可能认为这样命名的函数,比拟容易记忆。
之所以有些知情人要写 if name == ‘__main__’,可能想表明 main() 只有在以后脚本被间接执行时才运行,不心愿被导入其它模块时运行。
对于这些“知情人”,他们有肯定的情理。
然而,我集体并不举荐这种写法,甚至有时候会十分恶感!
最显著的例子:明明只有几十行代码,或者仅有一个脚本文件,实现一个简略的性能(一小段爬虫、用 turtle 画张图等等),然而它们都按后面的款式写了。
我每次看到这种不假思索的累赘代码,就感觉好受。为什么要写那行 if 语句呢?可能的话,应该拆分 main 函数,甚至不用封装成一个函数啊!
我集体总结出以下的教训:
- 突破惯性思维,写出纯粹的代码。main 入口函数是某些语言特有的,不该在 Python 中“照猫画虎”,应该理解脚本语言的特点,写出简洁优雅的格调
- 应用 main.py 而非 main()。因为 Python 的程序执行单位其实是脚本文件,而非某个函数或者类,所以倡议把入口文件命名为 main.py,外部的函数按需要而定
- 能够的话,应用 __main__.py 作为入口文件。这个文件联合命令行的“-m”参数应用,十分好用。
- 不举荐写 if name == ‘__main__’。首先,如果只有一个文件的话,因为不存在导出的可能,不倡议写。其次,存在多文件时,入口文件(main.py)中极不举荐写这一句,此文件的代码逻辑应该精炼,实践上其内容不该被导出到其它模块应用,因为它是终点!最初,多文件的非入口文件也不倡议写,因为在非入口文件中写这个判断,最大的作用就是写一些测试代码,然而测试代码应该分离出来,写到专门的目录或文件中。
小结:本文首先解释了什么是 main 入口函数,以及为什么某些语言会强制要求写 main 函数;接着,解释了为什么 Python 不须要写 main 函数;最初则是针对某些人存在的惯性误区,分享了我集体的四点编程教训。
以上就是本次分享的所有内容,想要理解更多 python 常识欢送返回公众号:Python 编程学习圈 ,发送“J”即可收费获取,每日干货分享