Python 没有main函数的原因


Posted in Python onJuly 10, 2020

毫无疑问 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”参数使用,非常好用。推荐阅读:为什么是 Python -m
  • 不推荐写if __name__ == '__main__' 。首先,如果只有一个文件的话,因为不存在导出的可能,不建议写。其次,存在多文件时,入口文件(main.py)中极不推荐写这一句,此文件的代码逻辑应该精炼,理论上其内容不该被导出到其它模块使用,因为它是起点!最后,多文件的非入口文件也不建议写,因为在非入口文件中写这个判断,最大的作用就是写一些测试代码,但是测试代码应该分离出来,写到专门的目录或文件中。

小结:本文首先解释了什么是 main 入口函数,以及为什么某些语言会强制要求写 main 函数;接着,解释了为什么 Python 不需要写 main 函数;最后则是针对某些人存在的惯性误区,分享了我个人的四点编程经验。

以上就是Python 没有main函数的原因的详细内容,更多关于Python main函数的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现根据窗口标题调用窗口的方法
Mar 13 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
Pyqt5实现英文学习词典
Jun 24 Python
使用pandas读取文件的实现
Jul 31 Python
python多线程同步实例教程
Aug 11 Python
python中的Elasticsearch操作汇总
Oct 30 Python
python3读取csv文件任意行列代码实例
Jan 13 Python
python3.x中安装web.py步骤方法
Jun 23 Python
如何基于Python实现word文档重新排版
Sep 29 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 Python
如何教少儿学习Python编程
Jul 10 #Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 #Python
django form和field具体方法和属性说明
Jul 09 #Python
浅谈Python里面None True False之间的区别
Jul 09 #Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 #Python
在CentOS7下安装Python3教程解析
Jul 09 #Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 #Python
You might like
PHP中几个常用的魔术常量
2012/02/23 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
功能强大的php文件上传类
2016/08/29 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
Python求解平方根的方法
2015/03/11 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
python实现扫描日志关键字的示例
2018/04/28 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
python groupby 函数 as_index详解
2019/12/16 Python
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
毕业生精彩的自我评价分享
2013/10/06 职场文书
总经理办公室主任岗位职责
2013/11/12 职场文书
美德好少年事迹材料
2014/01/19 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
低碳环保口号
2014/06/12 职场文书
天河观后感
2015/06/11 职场文书