Python 为什么要使用def main()?
我看过一些使用Python 为什么要使用def main()?,python,coding-style,Python,Coding Style,我看过一些使用 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) 我只是想知道m
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是否有押韵?如果没有main sentinel,即使脚本作为模块导入,代码也会执行。考虑第二个脚本。如果将其导入另一个文件,则将执行“全局级别”的指令。如果foo.py的内容
print __name__
if __name__ == '__main__':
print 'XXXX'
文件foo.py有两种使用方式。
- 已导入另一个文件:
import foo
\uu name\uu
是foo
,代码部分不会执行,也不会打印XXXX
- 直接执行:
python foo.py
\uuuuu name\uuuuuu
与\uuuu main\uuuuu
相同,该部分中的代码被执行并打印XXXX
使用此功能在同一模块内编写各种单元测试的方法之一 “”已被回答
使用
main()
函数可以在导入模块时调用其功能。这个(IMHO)的主要好处(不是双关语)是您可以对它进行单元测试。其他人都已经回答了这个问题,但我想我还有其他需要补充的地方
如果语句调用main()
(无特定顺序),则产生该的原因:
- 其他语言(如C和Java)有一个
main()
函数,在程序执行时调用该函数。使用这个if
,我们可以让Python像它们一样工作,这对许多人来说更熟悉
- 代码将更清晰、更易于阅读,并且更有条理。(是的,我知道这是主观的)
- 可以
将
python代码作为一个模块导入,而不会产生令人讨厌的副作用
- 这意味着可以对该代码运行测试
- 这意味着我们可以将该代码导入一个交互式python shell并测试/调试/运行它
- def main
def
内部的变量是局部的,而其外部的变量是全局的。这可能会引入一些错误和意外行为
但是,您不需要编写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()
因此,请随意编写更适合您的代码。:) 请参阅stackoverflow.com/questions/419163/what-does-if-name-main-do不能回答整个问题。假定的副本不能回答的是:拥有main()函数(而不是将所有代码写入“if name”块)非常有用,因为它可以避免意外创建可能影响其他函数的全局变量。与其他答案一样,拥有执行代码的入口点可以使用setup.py中的入口点自动生成可执行脚本,以包装导入和执行步骤。当您希望您的用户能够编写设置我的应用程序…
而不是python2.7/opaque/path/to/module.py…
时,这很好。这样做的缺点是,对于main()设置的每个常量,我的代码在“def main()”的顶部都有大量的“全局”声明。这看起来很不专业(至少对我来说)。还值得注意的是,使用main()
函数可以运行以下代码:import模块;module.main()
。如果代码只是在If
块中,则无法从其他位置运行。2个答案相同的问题不会使它们成为问题duplicates@bubakazouba:我同意。我没有把这个问题标为重复问题。这个问题的一部分有一个非常好的答案,我认为没有必要重复这个答案。我回答了问题的其余部分。使用sys.argv
作为参数调用main
的一个好处是,这种方法可以很好地与argparse
模块配合使用(在我看来,这是处理命令行参数的正确方法)。您只需在main
中将argv
传递到parse_args
。