为什么要使用def main()?

时间:2010-10-28 08:54:21

标签: python coding-style

  

可能重复:
  What does if __name__== "__main__" do?

我见过一些使用

的代码示例和教程
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)

我只是想知道主要有没有押韵?

5 个答案:

答案 0 :(得分:586)

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

答案 1 :(得分:228)

其他人已经回答了这个问题,但我想还有其他事情需要补充。

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

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

  • 代码将更清洁,更易于阅读,更有条理。 (是的,我知道这是主观的)

  • 可以import将python代码作为一个没有讨厌副作用的模块。

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

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

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

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

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

即使您将代码放在main函数中,也不需要完全按照它编写代码。一个简洁的变化可能是:

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()

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

答案 2 :(得分:88)

如果foo.py的内容

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

文件foo.py可以通过两种方式使用。

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

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

  
      
  • 直接执行:python foo.py
  •   

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

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

答案 3 :(得分:17)

What does if __name__==“__main__”: do?”已经得到解答。

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

答案 4 :(得分:7)

考虑第二个脚本。如果您将其导入另一个,则将执行“全局级别”的说明。