2010-10-28 1481 views
400

可能重复:
What does if __name__== "__main__" do?为什么使用def 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) 

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

+2

请参阅http://stackoverflow.com/questions/419163/what-does-if-name-main-do – gimel 2010-10-28 08:57:47

+8

stackoverflow.com/questions/419163/what-does-if-name-main-do does不回答整个问题。 – Johnsyweb 2010-10-28 09:09:09

+4

假定的重复没有回答:有一个main()函数(而不是仅将所有代码写入“if __name__”块)非常有用,因为它避免了意外创建可能影响其他函数的全局变量。 – slowdog 2010-10-29 17:05:40

回答

465

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

+121

也值得注意的是,有一个'main()'函数可以使用以下代码运行该代码:'import module; module.main()'。如果代码只在“if”块中,则不能从其他位置运行。 – FogleBird 2010-10-28 13:13:04

7

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

72

如果foo.py

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

的文件foo.py的内容可以以两种方式使用。

  • 进口在另一个文件:import foo

在这种情况下__name__foo,代码部分没有得到执行,并且不打印XXXX

  • 直接执行:python foo.py

当直接执行,__name__是相同__main__并执行该节中的代码,并打印XXXX

一项的用途的该功能可以在同一模块中编写各种单元测试。

+0

虽然这个答案比其他人少投票,但解释得很清楚。我读过[这个答案](http://stackoverflow.com/a/419185/2455888)之前,但你的解释很好。 +1 – haccks 2014-07-06 10:32:56

15

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

拥有main()功能允许您调用它的功能,如果您的模块为import。这个(恕我直言)的主要(不是双关语意图)好处是你可以单元测试它。

+1

2个问题具有相同的答案不会让他们重复 – bubakazouba 2015-05-20 00:26:59

+3

@bubakazouba:我同意。我没有把这个问题标记为重复。 *这个问题的一部分*有一个非常好的答案,我没有看到重复答案。我回答了问题的其余部分。 – Johnsyweb 2015-05-20 05:24:37

183

其他人都已经回答了,但我想我还有其他东西要补充。

原因有if声明,呼吁main()(排名不分先后):

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

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

  • 这将是可能的import python代码作为模块没有讨厌的副作用。

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

    • 这意味着我们可以将该代码导入交互式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() 

所以,请随时到更适合写的代码你。 :)

+0

以'sys.argv'作为参数调用'main'的好处之一就是这种方法适用于'argparse'模块(其中,IMO是用于处理命令行参数的*正确的方法) 。所有你需要做的不同就是将'argv'传递给'main'中的'parse_args'。 – jkt123 2017-08-23 21:54:02

相关问题