为什么要使用def main()?

Wiz*_*ard 545 python coding-style

可能重复:
if __name__== "__main__"什么?

我见过一些使用的代码示例和教程

def main():
    # my code here

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

但为什么?是否有任何理由不在文件顶部定义您的函数,然后只在其下编写代码?即

def my_function()
    # my code here

def my_function_two()
    # my code here

# some code
# call function
# print(something)
Run Code Online (Sandbox Code Playgroud)

我只是想知道主要有没有押韵?

Ign*_*ams 608

如果没有主要的标记,即使脚本作为模块导入,代码也会被执行.

  • 还值得注意的是,使用`main()`函数可以运行该代码:`import module; module.main()`.如果代码只在`if`块中,则无法从其他地方运行. (168认同)

Den*_*aia 237

其他人已经回答了,但我想我还有别的东西需要补充.

让该if声明调用的理由main()(无特定顺序):

  • 其他语言(如C和Java)具有在main()执行程序时调用的函数.使用它if,我们可以使Python像他们一样,这对许多人来说更为熟悉.

  • 代码将更清晰,更易于阅读和更有条理.(是的,我知道这是主观的)

  • importpython代码作为一个没有令人讨厌的副作用的模块是可能的.

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

    • 这意味着我们可以将该代码导入交互式python shell并测试/调试/运行它.

  • 里面def main的变量是本地的,而外面的变量是全局的.这可能会引入一些错误和意外行为.

但是,您不需要编写main()函数并在if语句中调用它.

我自己通常开始编写没有任何功能的小型一次性脚本.如果脚本变得足够大,或者如果我觉得将所有代码放在函数中会使我受益,那么我重构代码并执行它.当我编写bash脚本时也会发生这种情况.

即使您将代码放在main函数中,也不需要完全按照它编写代码.一个整洁的变化可能是:

import sys

def main(argv):
    # My code here
    pass

if __name__ == "__main__":
    main(sys.argv)
Run Code Online (Sandbox Code Playgroud)

这意味着您可以main()从其他脚本(或交互式shell)调用传递自定义参数.这可能在单元测试或批处理时很有用.但请记住,上面的代码需要解析argv,因此使用传递已经解析的参数的不同调用可能会更好.

在我编写的面向对象的应用程序中,代码看起来像这样:

class MyApplication(something):
    # My code here

if __name__ == "__main__":
    app = MyApplication()
    app.run()
Run Code Online (Sandbox Code Playgroud)

所以,随意编写更适合您的代码.:)

  • 使用`sys.argv`作为参数调用`main`的一个好处是,这种方法适用于`argparse`模块(IMO,*正确的方法*来处理命令行参数).你需要做的就是将`argv`传递给`main`中的`parse_args`. (4认同)

pyf*_*unc 90

如果foo.py的内容

print __name__
if __name__ == '__main__':
    print 'XXXX'
Run Code Online (Sandbox Code Playgroud)

文件foo.py可以以两种方式使用.

  • 导入另一个文件: import foo

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

  • 直接执行: python foo.py

当它直接执行时,__name____main__该部分中的代码相同并打印XXXX

使用此功能之一在同一模块中编写各种单元测试.


Joh*_*web 20

" if __name__==“__main__”:什么? "已经回答了.

有一个main() 功能,可以让你调用它的功能,如果你import的模块.这个(恕我直言)的主要(没有双关语)的好处是你可以对它进行单元测试.

  • @bubakazouba:我同意.我没有将此问题标记为重复.*这个问题的一部分*有一个非常好的答案,我认为没有必要重复答案.我回答了问题的其余部分*. (5认同)
  • 具有相同答案的2个问题不会使它们重复 (2认同)

Noe*_*Noe 8

考虑第二个脚本.如果您在另一个中导入它,将执行"全局级别"的指令.