本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
What does if __name__=="__main__" do?
我看过一些代码示例和教程
1
2
3
4
5def main():
# my code here
if __name__ =="__main__":
main()
但是为什么呢?有没有什么理由不在文件的顶部定义函数,然后在下面写代码?工业工程
1
2
3
4
5
6
7
8
9def my_function()
# my code here
def my_function_two()
# my code here
# some code
# call function
# print(something)
我只是想知道主旋律有没有押韵?
请参阅/questions/419163/what-do-if-name-main-do
/questions/419163/what-do-if-name-main-do无法回答整个问题。
所谓的副本并没有回答:拥有一个main()函数(而不是仅仅将所有代码写入"if name"块)是有用的,因为它可以避免意外地创建可能影响其他函数的全局变量。
以及其他答案,有一个执行代码的入口点可以使用中的入口点自动生成可执行脚本,这些脚本包装导入和执行步骤。当你希望你的用户能够写setup-my-app ...而不是python2.7 /opaque/path/to/ ...时,这是很好的。
如果没有主sentinel,即使脚本作为模块导入,也会执行代码。
同样值得注意的是,拥有一个main()函数可以使用:import module; ()运行该代码。如果代码只是在if块中,则无法从其他地方运行。
其他人都已经回答过了,但我想我还有别的事要补充。
调用main()的if语句(无特殊顺序)的原因:
其他语言(如C语言和Java语言)有一个EDOCX1×7函数,它在执行程序时被调用。使用这个if,我们可以使python的行为像它们一样,这让许多人觉得更熟悉。
代码将更干净、更容易阅读和更具组织性。(是的,我知道这是主观的)
对于import来说,将python代码作为一个模块是可能的,不会产生不良的副作用。
这意味着可以对该代码运行测试。
这意味着我们可以将该代码导入到交互式Python shell中,并测试/调试/运行它。
def main中的变量是局部变量,而它之外的变量是全局变量。这可能会引入一些错误和意外行为。
但是,不需要编写main()函数并在if语句中调用它。
我自己通常开始写一些没有任何功能的废弃脚本。如果脚本变得足够大,或者如果我觉得将所有代码放在函数中对我有利,那么我重构代码并执行它。当我编写bash脚本时,也会发生这种情况。
即使您将代码放在主函数中,也不需要完全按此方式编写代码。一个简单的变化可能是:
1
2
3
4
5
6
7
8import sys
def main(argv):
# My code here
pass
if __name__ =="__main__":
main()
这意味着您可以从传递自定义参数的其他脚本(或交互shell)调用main()。这可能在单元测试或批处理时很有用。但请记住,上面的代码将需要解析argv,因此最好使用传递已解析参数的不同调用。
在我编写的面向对象应用程序中,代码如下所示:
1
2
3
4
5
6class MyApplication(something):
# My code here
if __name__ =="__main__":
app = MyApplication()
()
因此,请随意编写更适合您的代码。:)
使用作为参数调用main的一个好处是,这种方法与argparse模块(imo是处理命令行参数的正确方法)很好地工作。你所需要做的就是在main中把argv传给parse_args。
如果的内容
1
2
3print __name__
if __name__ == '__main__':
print 'XXXX'
文件可以通过两种方式使用。
imported in another file : import foo
在这种情况下,__name__为foo,代码段不执行,不打印XXXX。
executed directly : python
直接执行时,__name__与__main__相同,执行该段代码并打印XXXX。
使用此功能在同一模块中编写各种单元测试的一种。
"if __name__=="__main__":是做什么的?"已经回答。
如果您使用import模块,那么拥有main()功能允许您调用它的功能。这个(imho)的主要(没有双关语)好处是您可以对它进行单元测试。
两个答案相同的问题不会重复。
@布巴卡佐巴:我同意。我没有将这个问题标记为副本。这个问题的一部分有一个很好的答案,我认为复制答案毫无意义。我回答了剩下的问题。
考虑第二个脚本。如果您将其导入到另一个目录中,那么将执行"全局级"的指令。