为什么Python没有main()函数?


在这篇文章中,我们将学习为什么Python没有main()函数。

毫无疑问,Python **没有**所谓的**主函数**,但是,互联网上的文章经常提到“**Python的主函数**”和“**建议编写主函数**”。

他们的目的可能是为了复制原始的主要方法,但是许多人因此被误导(或误解),并创建了极其复杂的代码。

在我们开始之前,我们将回答以下两个问题:

  • “主函数”到底是什么?

  • 为什么一些编程语言需要使用主函数?

一些编程语言,例如C/C++、C#、Java、Go、Rust等,使用主函数作为程序的执行入口,这具有特殊的含义:

  • 此主函数名称是必需的,这意味着必须有一个主函数。

  • 因为只能有一个主函数,所以每个程序入口都是唯一的。

  • 语法格式有特定的要求,并遵循非常一致(固定)的模板。

为什么必须强制执行主入口函数?

这些是编译型语言,需要将代码编译成可执行二进制文件,以便操作系统/引导加载程序找到程序的起始位置,因此必须定义此函数。

简单来说,在一大堆可执行代码中,必须定义一个明确的开始。

主函数是这些语言的一个重要的有机特性。

但是,当我们回到Python时,情况发生了巨大的变化。

  • Python是一种解释型语言,也称为脚本语言。运行过程从上到下,一行一行地运行,这意味着它的起始点是已知的。

  • 每个**.py文件**都是一个可执行文件,可以用作程序的入口点,这意味着程序的入口点是灵活的,不需要遵循任何约定。

  • 在不指定入口文件(更常见的命令行,例如“**python -m http.server 8000**”)的情况下执行Python项目时,可能是因为存在main.py文件,该文件作为包中的一个“文件”来执行操作。

总而言之,脚本语言Python与编译型语言不同。它可以选择在单个模块(即.py文件)级别或由许多模块组成的包级别灵活的执行方式,这与其他无法在没有明确定义的入口的情况下实现的语言不同。

换句话说,Python不需要程序员在语法级别上指定统一的入口(无论是函数、类还是其他)。

一些用户可能会感到困惑,因为他们经常遇到或编写以下代码:

# defining the main function using the def keyword
def main():
   ……
if __name__ == '__main__':
   main()

这不是Python的主函数吗?我相信我们很多人都会同意!

不,它不是。

除了函数名称为“**main**”之外,它与我们前面描述的正统主函数没有任何联系,它既不是必需的,也不一定控制程序执行的顺序。没有它也不会导致任何语法问题。

有些人希望标识一个“**main**”函数来强调其“主要”状态,并将其人工放置为第一个执行的函数。

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

他们可能希望编写`if __name__ == '__main__':`来表明`main()`仅在直接执行当前脚本时运行,而当将其导入其他模块时不应执行。

但是,我们不建议这种编写风格。

最常见的例子:只有几十行代码或一个实现简单功能的脚本文件(一个小爬虫,用turtle画图等),但它们都以与之前相同的方式编写。

由于以下原因,不建议编写`if __name__ == '__main__':`:

  • 首先,如果只有一个文件,因为没有导出选项。

  • 其次,如果有多个文件,强烈不建议在入口文件(main.py)中编写此语句。因为它作为起点,其内容不应导出以供其他模块使用。

  • 最后,不建议在有多个文件的非入口文件中编写此判断,因为最多只能创建一些这样的测试程序。但是,测试代码应该分开存储在单独的目录或文件中。

每当我遇到这种复杂的代码而没有思考时,我都会感到担忧。你为什么写那个if语句?如果可能的话,拆分主函数,甚至不要把它包装在一个函数中!

总结

  • 摆脱惯性思维,构建真实的代码。主入口函数是某些语言所特有的,不应在Python中使用。你应该理解脚本语言的特性,并以简洁明了的方式编写。

  • 使用**main.py**代替**main()**。因为Python的程序执行单元是脚本文件而不是函数或类,所以入口文件应该命名为main.py,内部函数则根据需求决定。

  • 如果可行,请使用main.py作为入口文件。此文件易于与命令行上的“-m”参数结合使用。

结论

在这篇文章中,我们学习了为什么Python与其他编程语言不同,它没有main()函数。我们还学习了条件`__name__ == '__main__'`。

更新于:2023年1月2日

998 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.