【问题标题】:Why use def main()? [duplicate]为什么要使用 def main()? [复制]
【发布时间】:2011-05-01 18:32:02
【问题描述】:

我看过一些使用的代码示例和教程

def main():
    # my code here

if __name__ == "__main__":
    main()

但是为什么呢?有什么理由不在文件顶部定义你的函数,然后在它下面写代码?即

def my_function()
    # my code here

def my_function_two()
    # my code here

# some code
# call function
# print(something)

我只是想知道主要是否有任何押韵?

【问题讨论】:

  • stackoverflow.com/questions/419163/what-does-if-name-main-do 没有回答整个问题。
  • 假设的副本没有回答的问题:拥有一个 main() 函数(而不是仅仅将所有代码写入“if name”块)很有用,因为它避免意外创建可能影响其他函数的全局变量。
  • 与其他答案一样,拥有执行代码的入口点可以使用 setup.py 中的入口点自动生成包含导入和执行步骤的可执行脚本。当您希望您的用户能够编写 setup-my-app ... 而不是 python2.7 /opaque/path/to/module.py ... 时,这很好
  • 这样做的缺点是现在我的代码在 main() 设置的每个 CONSTANT 的“def main()”顶部都有大量“全局”声明。这看起来不专业(至少对我来说)。

标签: python coding-style


【解决方案1】:

没有主哨兵,即使脚本作为模块导入,代码也会被执行。

【讨论】:

  • 另外值得注意的是,拥有main() 函数可以使用import module; module.main() 运行该代码。如果代码只是在if 块中,则无法从其他地方运行。
  • 为什么python不支持python code.py自动执行的专业main()函数?
【解决方案2】:

其他人都已经回答过了,但我想我还有点要补充的。

if 语句调用main() 的原因(无特定顺序):

  • 其他语言(如 C 和 Java)有一个 main() 函数,该函数在程序执行时被调用。使用这个if,我们可以让 Python 表现得像他们一样,这对很多人来说感觉更熟悉。

  • 代码会更干净,更容易阅读,更有条理。 (是的,我知道这是主观的)

  • 可以import 将该 python 代码作为一个模块,而不会产生讨厌的副作用。

  • 这意味着可以针对该代码运行测试。

  • 这意味着我们可以将该代码导入交互式 python shell 并测试/调试/运行它。

  • def main 内部的变量是local,而外部的变量是global。这可能会引入一些错误和意外行为。

但是,您不需要编写main() 函数并在if 语句中调用它。

我自己通常开始编写没有任何功能的小型一次性脚本。如果脚本变得足够大,或者如果我觉得将所有代码放在一个函数中对我有好处,那么我会重构代码并执行此操作。当我编写 bash 脚本时也会发生这种情况。

即使你把代码放在主函数中,你也不需要完全那样写。一个简洁的变化可能是:

import sys

def main(argv):
    # My code here
    pass

if __name__ == "__main__":
    main(sys.argv)

这意味着您可以从传递自定义参数的其他脚本(或交互式 shell)调用 main()。这在单元测试或批处理时可能很有用。但请记住,上面的代码需要解析 argv,因此使用其他调用传递已解析的参数可能会更好。

在我编写的一个面向对象的应用程序中,代码如下所示:

class MyApplication(something):
    # My code here

if __name__ == "__main__":
    app = MyApplication()
    app.run()

所以,请随意编写更适合您的代码。 :)

【讨论】:

  • 使用sys.argv 作为参数调用main 的一个好处是,这种方法与argparse 模块(IMO 是正确的方式 处理命令行参数)。您需要做的只是将argv 传递给parse_argsmain 中。
【解决方案3】:

如果 foo.py 的内容

print __name__
if __name__ == '__main__':
    print 'XXXX'

文件 foo.py 有两种使用方式。

  • 在另一个文件中导入:import foo

在这种情况下__name__foo,代码部分不会被执行并且不会打印XXXX

  • 直接执行:python foo.py

直接执行时,__name____main__相同,执行该部分的代码并打印XXXX

使用此功能在同一模块中编写各种单元测试。

【讨论】:

    【解决方案4】:

    What does if __name__==“__main__”: do?”已被回答。

    拥有main() 函数 允许您在import 模块时调用其功能。这个(恕我直言)的主要(没有双关语)好处是您可以对其进行单元测试。

    【讨论】:

    • 2 个相同答案的问题不会使它们重复
    • @bubakazouba:我同意。我没有将此问题标记为重复。 这个问题的一部分有一个非常好的答案,我认为复制答案没有意义。我回答了问题的其余部分
    【解决方案5】:

    考虑第二个脚本。如果你将它导入另一个,就会执行“全局级别”的指令。

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 1970-01-01
      • 2020-03-08
      • 2017-05-19
      • 1970-01-01
      • 2010-10-01
      • 2012-12-28
      • 2017-03-27
      • 2013-09-18
      相关资源
      最近更新 更多