首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么使用def main()?

为什么使用def main()?
EN

Stack Overflow用户
提问于 2010-10-28 16:54:21
回答 5查看 721.8K关注 0票数 594

我看过一些代码示例和教程,它们使用

代码语言:javascript
运行
复制
def main():
    # my code here

if __name__ == "__main__":
    main()

但是为什么呢?有什么理由不在文件的顶部定义你的函数,然后在它下面写代码?即

代码语言:javascript
运行
复制
def my_function()
    # my code here

def my_function_two()
    # my code here

# some code
# call function
# print(something)

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-28 16:56:04

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

票数 654
EN

Stack Overflow用户

发布于 2010-10-28 18:00:48

其他人都已经回答了,但我想我还有一些东西要补充。

让该if语句调用main()的原因(没有特定的顺序):

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

  • 代码将更干净、更易读、更有条理。(是的,我知道这是主观的)

在没有讨厌side-effects.的情况下,可以将

  • 代码作为一个模块进行import

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

  • 这意味着我们可以将该代码导入到交互式python外壳中,并对其进行测试/调试/运行。

def main内部的

  • 变量是局部,而它外部的变量是全局。这可能会引入一些错误和意外行为。

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

我自己通常开始写一些没有任何功能的小的一次性脚本。如果脚本变得足够大,或者如果我觉得将所有这些代码放在一个函数中对我有好处,那么我就重构代码并这样做。当我编写bash脚本时,也会发生这种情况。

即使您将代码放在main函数中,也不需要完全像那样编写它。一种简洁的变体可以是:

代码语言:javascript
运行
复制
import sys

def main(argv):
    # My code here
    pass

if __name__ == "__main__":
    main(sys.argv)

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

在我编写的一个面向对象的应用程序中,代码如下所示:

代码语言:javascript
运行
复制
class MyApplication(something):
    # My code here

if __name__ == "__main__":
    app = MyApplication()
    app.run()

因此,请随意编写更适合您的代码。:)

票数 262
EN

Stack Overflow用户

发布于 2010-10-28 16:57:08

如果foo.py的内容

代码语言:javascript
运行
复制
print __name__
if __name__ == '__main__':
    print 'XXXX'

文件foo.py可通过两种方式使用。

在另一个文件中导入的

  • import foo

在本例中,__name__foo,代码段不会执行,也不会打印XXXX

直接执行的

  • python foo.py

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

此功能的一个用途是在同一模块中编写各种类型的单元测试。

票数 93
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4041238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档