编程派|为什么我不推荐写 main 函数?
北京联盟_本文原题:为什么我不推荐写 main 函数?
本文插图
作者:豌豆花下猫
来源:Python猫公众号
毫无疑问 Python 中没有所谓的 main 入口函数 , 但是网上经常看到一些文章提“Python 的 main 函数”、“建议写 main 函数”……
有些人是知情的 , 他的意图可能是模仿那些正宗的 main 函数 , 但还有不少人明显是被误导了(或自己误解了) , 就写出来很累赘的代码 。
本期“Python 为什么”栏目来聊聊 Python 为什么没有 main 函数?
在开始正题之前 , 先要来回答这两个问题: 所谓的 “main 函数”是指什么?为什么有些编程语言需要强制写一个 main 函数?
某些编程语言以 main 函数作为程序的执行入口 , 例如 C/C++、C#、 Java、Go 和 Rust 等 , 它们具有特定的含义:
- main 函数名是强制的 , 也就是要求必须有一个 main 函数
- main 函数最多只能有一个 , 也就是说程序的入口是唯一的
- 语法格式有一定的要求 , 具有相对固定的模板
这些语言是编译型语言 , 需要把代码编译成可执行的二进制文件 , 为了让操作系统/启动器找到程序的起点 , 所以要约定这一个函数 。 简单地说 , 就是在一大堆代码里 , 需要定义一个显著的可用于执行的开头 。
不难看出 , main 函数是那些语言中重要而不可缺的有机组成部分 。
然而 , 我们再来看看 Python , 情况就大不相同了 。
- Python 是解释型语言 , 即脚本语言 , 运行过程是从上往下 , 逐行解析运行 , 也就是说它的起点是可知的
- 每个 .py 文件就是一个可执行文件 , 都可作为整个程序的入口文件 , 也就是说程序的入口是灵活可变的 , 没有必须遵守的约定
- 有时候运行 Python 项目 , 并没有指定入口文件(命令行中较常见 , 例如"python -m http.server 8000") ,那可能是存在 __ main __ .py 文件 , 它所在的包被当成一个“文件”来执行了
也就是说 , Python 没有必要在语法层面规定程序员必须定义出一个统一的入口(不管是函数还是类还是什么东西) 。
有些同学可能会有疑惑 , 因为他们经常看到或者自己写出下面这样的代码:
【编程派|为什么我不推荐写 main 函数?】# main 里是某些主体代码
defmain:
……
if__name__ == '__main__':
main
难道这不就是 Python 的 main 函数么?相信有不少同学会这么想!
非也!非也!
除了函数名是“main”以外 , 它跟我们前面介绍的正统的 main 函数没有半毛钱关系 , 既没有强制性 , 也没有必然决定程序执行顺序的作用 。 缺少它 , 也不会导致什么语法问题 。
之所以有些知情人要命名出一个”main“函数 , 其实是想强调它的”主要“地位 , 想要人为地安排它作为第一个执行的函数 。 他们可能认为这样命名的函数 , 比较容易记忆 。
之所以有些知情人要写 if __name__ == '__main__', 可能想表明 main 只有在当前脚本被直接执行时才运行 , 不希望被导入其它模块时运行 。
对于这些“知情人” , 他们有一定的道理 。
但是 , 我个人并不推荐这种写法 , 甚至有时候会非常反感!
最明显的例子:明明只有几十行代码 , 或者仅有一个脚本文件 , 实现一个简单的功能(一小段爬虫、用 turtle 画张图等等) , 但是它们都按前面的样式写了 。
推荐阅读
- 思丝如针|47岁离异男:想找一个二婚对象,为什么这么不容易?
- 潇妈聊育儿|“到饭点才喊你的饭局,除非是铁哥们,否则别去”!这是为什么?
- 乳酸菌|为什么乳酸菌对我们的健康很重要?
- 朱棣|朱棣死之前是怎么安排传位的呢?为什么朱棣很被动?
- 九子|为什么龙生九子各不相同?看看这九子的母亲都是谁
- 售楼|为什么越来越多购房者避开毛坯房?听完售楼哥们的话庆幸早知道
- 李寻欢|《多情剑客无情剑》李寻欢:小李飞刀,为什么不是排第一?
- 文化|河南约7000年文化老城,县名朗朗上口,为什么大多数人总会念错?
- 朱元璋|朱元璋和马皇后生了那么多儿子,为什么朱元璋最喜欢朱标?
- 吕后|吕后为什么给一个大臣下跪,史书不会告诉你
