【问题标题】:Why a function called `main` doesn't have any special significance?为什么一个叫做 `main` 的函数没有任何特殊意义?
【发布时间】:2012-08-13 06:33:45
【问题描述】:

为什么在 Python 中名为 main 的函数没有像在 C 和 Java 中那样具有任何特殊意义?

如果程序员从 C 或 Java 切换到 Python 会怎样。他应该保持 在 Python 中使用 main 也像在 C 或 Java 中一样,因为这是他现在要做的风格 编程或广义上的它对做某事是有害的 用 Python 编程?

编辑:我已经阅读了这篇文章,其中有一个很好的例子提到了为什么第一次程序员应该避免在 python main in python harmful 中使用 main。

【问题讨论】:

  • 这里有一个反问你:为什么它应该在任何语言中有意义?考虑会回答这个问题。
  • 因为这就是“Python 的工作方式”.. 但是,请考虑,不像 C 或 Java 整个 Python 文件(class、def、 import 等)只是执行代码!“定义”和“可执行代码”没有分离。因此文件本身是执行的入口点!

标签: python main


【解决方案1】:

您还应该问,为什么在 C 和 Java 中main 具有特殊意义。这只是语言设计者的选择。 main 很可能被称为 start 或 begin 但有人选择了 main 并且卡住了。

在 Python 中,没有理由不能调用函数 main 并将其作为程序的起点。但是,Python 有自己的语法来识别某个文件是否等同于main:

__name__ == "__main__"

这通常包装为if 的一部分,并且可以在调用实际启动程序的main 函数中仅包含一行。

Python 和许多(全部?)脚本语言的部分设计是可以简单地内联编写代码。您不必将所有内容都包装在一个函数中。因此,许多简单的脚本根本不需要任何函数。例如,轮换日志文件的 cron 作业可以写成 Python 文件中的代码块,而无需定义任何函数。

在这种情况下,就不需要 main 方法。

在许多方面不需要main 使语言更加灵活,尤其是对于更简单的任务。

附录:

为您的编辑添加一些上下文。那篇文章提出了一个非常糟糕的论点。实际上,函数名称冲突并不少见,因为有许多模块执行相同或相似的事情(在核心中没有那么多,但一旦您开始使用 pip,您就会遇到奇怪的冲突)。因此,使用描述性函数名称并避免使用from foo import * 是有益的。

就像 C++ 程序员通常认为使用 using namespace std 污染命名空间是不好的形式一样,Python 程序员通常认为使用 import * 污染命名空间是不好的形式,尤其是如果使用它会导致滚雪球效应无处不在。

最后,您不太可能在程序main 中调用两个函数。您更有可能在其他地方发生名称冲突。真正的危险是通配符导入,而不是 main 函数。

【讨论】:

    【解决方案2】:

    这样的程序员应该这样做:

    if __name__ == "__main__":
        # run stuff
    

    如果未导入模块,则变量__name__ 设置为"__main__"。

    【讨论】:

    • 不,可以导入模块或文件,但if 条件内的代码不会运行,就像@Blender 在他的回答中指出的那样。
    • 对,我看错了。以为您的意思是如果使用if __name__=='__main__',则不会导入该模块。我的错,对不起
    【解决方案3】:

    在 Python 中,有一些类似main() 函数的作用:

    if __name__ == '__main__':
      # Your main function
    

    此if 块中的代码仅在 Python 文件尚未作为模块导入时运行。

    如果你决定使用那个丑陋的main() 函数,Python 的等价物应该是这样的:

    def main():
      # ...
    
    if __name__ == '__main__':
      main()
    

    我不觉得它很漂亮。

    【讨论】:

      【解决方案4】:

      在python中,.py文件既可以作为模块使用,也可以直接运行,所以main用于标识如果文件直接运行或者文件导入为哪个部分要运行模块。

      文件.py:

      def func(x,y):
          print x+y
      
      if __name__=='__main__':
          func(5,2):
      

      如果直接执行,它会打印 7

      导入时,主要部分不运行:

      >>> from so32 import *
      >>> func(5,5)
      10
      >>> func(10,20)
      30
      

      【讨论】:

        【解决方案5】:

        为什么在 Python 中名为 main 的函数没有像在 C 和 Java 中那样具有任何特殊意义?

        因为python在设计时没有考虑到C、java等语言,所以有些语言实际上不使用main,http://c2.com/cgi/wiki?HelloWorldInManyProgrammingLanguages有相当多的hello world程序你可以看到不是全部使用 main,尽管您可能无法真正比​​较它们...

        正如其他人所说,您可以通过检查if __name__ == '__main__': oh 和here 来检查模块是否直接从解释器运行,这是 python 的创建者 Guido Van Russon 关于如何编写主要函数的一些提示。

        如果程序员从 C 或 Java 切换到 Python 会怎样。他是否应该像在 C 或 Java 中一样继续在 Python 中使用 main,因为这是他现在进行编程的风格,还是从广义上讲,这对使用 Python 进行编程是有害的?

        当您编写 python 代码时,或者就此而言,当您编写任何程序时,总是尽量让代码在该语言中看起来很自然,这意味着遵循语言开发人员或整个社区设定的标准和实践,请不要' t 在 python 中编写类似 c 或 java 的代码是可能的,但它不赞成,代码容易出错,而且很难理解,有时速度很慢,这同样适用于任何其他语言。

        这很少有好的参考Python coding standards/best practices

        【讨论】:

          【解决方案6】:

          YouTube 上的 Kent D Lee 对为什么使用 main() 调用单个过程(或方法)进行了很好的解释 - 基本上这是因为没有 main(),所有变量都是全局的,而不仅仅是它们需要更长的时间才能访问,它们还冒着一个程序的变量会干扰另一个程序的变量的风险。此外,使用 main() 调用您的过程使您可以通过导入它们在另一个程序中重用这些过程。此外,您可以在不执行整个程序的情况下测试单个程序。当然,如果您要做的只是输出“hello world”,那么拥有 main 方法根本没有优势,您这样做的唯一原因是了解它是如何工作的。
          每个人都说 Python 对学习者有好处的原因是因为你可以很容易地立即开始做事——问题是,如果你要编写相当大的程序,你很快就会面临这样一个事实,即其他语言所具有的所有这些复杂性,其实很重要。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-11-15
            • 2013-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-23
            相关资源
            最近更新 更多