【Python】为什么 Python 没有 main 函数?

一、前言

众所周知,Python 中没有所谓的 main 函数,但是网上经常有文章提到 Python 的 main 函数 和 建议编写 main 函数。

其实,可能他们是想模仿真正的 main 函数,但是许多人都被误导(或误解),然后编写了非常笨拙的代码。

在开始讨论之前,我们先来回答以下两个问题:

  • 所谓的 main 函数究竟是什么意思?
  • 为什么有些编程语言必须编写 main 函数?

一些编程语言将 main 函数作为程序的执行入口,比如 C/C++C#JavaGoRust 等等,这个函数具有特定的含义:

  • main 函数名是必须的,这意味着必须有一个主函数;
  • 最多只能有一个 main 函数,这意味着程序的入口是唯一的;
  • 语法格式有特定要求,书写形式也相对固定。

二、为什么强制 main 函数作为入口

这些语言都是编译语言,需要将代码编译成可执行的二进制文件。为了让操作系统/引导程序找到程序的开头,需要定义这样一个函数。

简而言之,需要在大量可执行的代码中定义一个至关重要的的开头。

不难看出,对于这些语言来说,main 函数是不可或缺的组成部分。

但是,当我们把目光转向 Python 时,就会发现情况大不相同。

  • Python 是一种解释语言,即脚本语言。运行过程是从上到下,逐行进行的,这意味着它的起点是已知的。
  • 每个 .py 文件都是一个可执行文件,可作为整个程序的入口文件,意味着该程序的入口很灵活,而且无需遵循任何约定。
  • 有时运行 Python 项目时不需要有指定入口文件(命令行比较常见,例如 “ python -m http.server 8000” ),可能是因为该项目中有 main.py 文件,在软件包中作为“文件”来执行。

总而言之,Python 作为脚本语言不同于编译语言。无论是单个模块(即 .py 文件),还是由多个模块组成的软件包,Python 都可以选择一种灵活的执行方法,这完全不像其他语言那样必须定义入口。

换句话说,Python 不需要规定程序员必须在语法上定义一个统一的入口(无论是函数、类还是其他东西)。

有些学生可能会感到困惑,因为他们经常看到或编写以下代码:

# main file  
def main():      
    ……  
    
if __name__ == '__main__':      
    main()  

其实,这并不是 Python 的 main 函数。

除了函数名是 main 之外,这段代码与我们前面介绍的 main 函数没有半点关系,这个函数既不是必须的,也不能确定程序的执行顺序。即便没有上面这样的 main 函数,也不会有任何的语法问题。

人们想编写一个 main 函数的主要原因其实是为了强调这是一个主函数,希望人为地将其设置成第一个执行的函数。

他们可能认为这个名字的函数更容易记住。

他们之所以要编写__name__ ==‘main’,可能是因为想表明 main() 只在直接执行当前脚本时才运行,而在将其导入到其他模块时不要运行。

但是,我个人不推荐这种写法。

举一个简单的例子,假设只有几十行代码,或者一个脚本文件实现了一个简单的功能(一个爬虫,或画一只乌龟,等等),但都是按照前面的方式编写的。

不推荐 if name == ‘main’ 的写法,因为:

  • 首先,如果只有一个文件的话,那么这个文件不可能被导出。
  • 其次,如果有多个文件,强烈建议不要将这个语句写在入口文件(main.py)中。从理论上讲,它的内容不应该导出供其他模块使用,因为它是起点。
  • 最后,在多个文件的情况下,也不建议在非入口的文件中写入这条语句,因为这条语句能做的最多也就是编写一些测试代码。即便如此,测试代码也应分开写到专用目录或文件中。

每次看到这些笨拙的代码时,我都会感到不适。为什么要写这样的 if 语句?你压根不应该将这段代码包装成一个函数!

三、总结

  • 打破惯性思维,编写真实的代码。main 函数是某些语言的唯一入口,但不应在 Python 中使用。你应该了解脚本语言的特征,并学习简单而优雅的风格。
  • 你可以使用 main.py,而不是编写 main 函数。由于 Python 程序的执行单元是脚本文件,而不是函数或类,因此建议将入口文件命名为 main.py,并根据需要决定内部的函数。
  • main.py 作为入口文件。该文件可直接与命令行的 “-m” 参数结合使用。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅途中的宽~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值