为什么使用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)
我只是想知道主音是否有韵?
没有主标记,即使脚本作为模块导入,代码也会执行。
也值得注意的是,有一个'main()'函数可以使用以下代码运行该代码:'import module; module.main()'。如果代码只在“if”块中,则不能从其他位置运行。 – FogleBird 2010-10-28 13:13:04
考虑第二个脚本。如果您将其导入另一个,则将执行指令,如“全局级”。
如果foo.py
print __name__
if __name__ == '__main__':
print 'XXXX'
的文件foo.py的内容可以以两种方式使用。
- 进口在另一个文件:
import foo
在这种情况下__name__
是foo
,代码部分没有得到执行,并且不打印XXXX
。
- 直接执行:
python foo.py
当直接执行,__name__
是相同__main__
并执行该节中的代码,并打印XXXX
一项的用途的该功能可以在同一模块中编写各种单元测试。
虽然这个答案比其他人少投票,但解释得很清楚。我读过[这个答案](http://stackoverflow.com/a/419185/2455888)之前,但你的解释很好。 +1 – haccks 2014-07-06 10:32:56
“What does if __name__==“__main__”:
do?”已经被回答。
拥有main()
功能允许您调用它的功能,如果您的模块为import
。这个(恕我直言)的主要(不是双关语意图)好处是你可以单元测试它。
2个问题具有相同的答案不会让他们重复 – bubakazouba 2015-05-20 00:26:59
@bubakazouba:我同意。我没有把这个问题标记为重复。 *这个问题的一部分*有一个非常好的答案,我没有看到重复答案。我回答了问题的其余部分。 – Johnsyweb 2015-05-20 05:24:37
其他人都已经回答了,但我想我还有其他东西要补充。
原因有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()
所以,请随时到更适合写的代码你。 :)
以'sys.argv'作为参数调用'main'的好处之一就是这种方法适用于'argparse'模块(其中,IMO是用于处理命令行参数的*正确的方法) 。所有你需要做的不同就是将'argv'传递给'main'中的'parse_args'。 – jkt123 2017-08-23 21:54:02
请参阅http://stackoverflow.com/questions/419163/what-does-if-name-main-do – gimel 2010-10-28 08:57:47
stackoverflow.com/questions/419163/what-does-if-name-main-do does不回答整个问题。 – Johnsyweb 2010-10-28 09:09:09
假定的重复没有回答:有一个main()函数(而不是仅将所有代码写入“if __name__”块)非常有用,因为它避免了意外创建可能影响其他函数的全局变量。 – slowdog 2010-10-29 17:05:40