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