为什么使用def main()?

可能重复:
if __name__== "__main__"做什么?

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

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)

我只是想知道主音是否有韵?


如果没有主标记,即使脚本作为模块导入,代码也会执行。


其他人已经回答了这个问题,但我认为我还有其他东西需要补充。

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

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

  • 代码将更清晰,更易于阅读和更好地组织。 (是的,我知道这是主观的)

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

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

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

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

  • 但是,您不需要编写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()
    

    所以,随意写出更适合你的代码。 :)


    如果foo.py的内容

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

    一个文件foo.py可以以两种方式使用。

  • 在另一个文件中import fooimport foo
  • 在这种情况下, __name__foo ,代码段不会被执行,也不会打印XXXX

  • 直接执行: python foo.py
  • 直接执行时, __name____main__相同,并执行该部分中的代码并打印XXXX

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

    链接地址: http://www.djcxy.com/p/9307.html

    上一篇: Why use def main()?

    下一篇: server python and file opening error