毫无疑问 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“函数,其实是想强调它的”重点“地位,想要人为地安排它做为第1个执行的函数。她们可能认为这般命名的函数,比较容易记忆。
之因此有些知情人要写if __name__ == __main__ ,可能想显示 main() 仅有在当前脚本被直接执行时才运行,不期盼被导入其它模块时运行。
针对这些“知情人”,她们有必定的道理。
然则,我个人并不举荐这种写法,乃至有时候会非常反感!
最明显的例子:明明仅有几十行代码,或仅有一个脚本文件,实现一个简单的功能(一小段爬虫、用 turtle 画张图等等),然则它们都按前面的样式写了。
我每次看到这种不假思索的负担代码,就觉得难受。为何要写那行 if 语句呢?可能的话,应该拆分 main 函数,乃至不必封装成一个函数啊!
我个人总结出以下的经验: 打破惯性思维,写出地道的代码。main 入口函数是某些语言特有的,不应在 Python 中“照猫画虎”,应该认识脚本语言的特点,写出简洁优雅的风格运用 main.py 而非 main()。由于 Python 的程序执行单位其实是脚本文件,而非某个函数或类,因此意见把入口文件命名为 main.py,内部的函数按需求而定能够的话,运用main.py 做为入口文件。这个文件结合命令行的“-m”参数运用,非常好用。举荐阅读:Python 中 -m 的典型用法、原理解析与发展演变不举荐写if name__ == __main。首要,倘若仅有一个文件的话,由于不存在导出的可能,不意见写。其次,存在多文件时,入口文件(main.py)中极不举荐写这一句,此文件的代码规律应该精炼,理论上其内容不应被导出到其它模块运用,由于它是起点!最后,多文件的非入口文件亦不意见写,由于在非入口文件中写这个判断,最大的功效便是写有些测试代码,然则测试代码应该分离出来,写到专门的目录或文件中。小结:本文首要解释了什么是 main 入口函数,以及为何某些语言会强制需求写 main 函数;接着,解释了为何 Python 不必须写 main 函数;最后则是针对某些人存在的惯性误区,分享了我个人的四点编程经验。
本文属于“Python为何”系列文案(Python猫出品),该系列重点关注 Python 的语法、设计和发展等专题,以一个个“为何”式的问题为切入点,试着展现 Python 的迷人魅力。部分专题会推出视频版,请在 B 站收看,观看位置: https://space.bilibili.com/97566624/video
公众号【Python猫】, 本号连载优秀的系列文案,有Python为何系列、喵星哲学猫系列、Python进阶系列、好书举荐系列、技术写作、优秀英文举荐与翻译等等,欢迎关注哦。
|