为何使用 def main()?

615 投票
5 回答
742219 浏览
提问于 2025-04-16 06:13

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

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)

我只是想知道,主函数有什么特别的地方吗?

5 个回答

93

如果foo.py的内容是:

print __name__
if __name__ == '__main__':
    print 'XXXX'

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

  • 在另一个文件中导入:import foo

在这种情况下,__name__的值是foo,这段代码不会被执行,也不会打印XXXX

  • 直接执行:python foo.py

当直接执行时,__name__的值和__main__是一样的,这段代码会被执行并打印XXXX

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

267

其他人已经回答过这个问题了,但我觉得我还有一些补充的内容。

关于在 if 语句中调用 main() 函数的理由(没有特定顺序):

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

  • 代码会更加 整洁,更容易阅读,组织得也更好。(是的,我知道这有点主观)

  • 这样可以将 Python 代码作为模块导入,而不会产生一些麻烦的副作用。

  • 这意味着可以对这些代码进行测试。

  • 这也意味着我们可以在交互式 Python 环境中导入这些代码并进行测试、调试或运行。

  • def main 里面的变量是 局部 的,而在外面的变量是 全局 的。这可能会引入一些错误和意想不到的行为。

但是,你并不需要if 语句中写一个 main() 函数并调用它。

我自己通常会先写一些小的临时脚本,不用任何函数。如果脚本变得足够大,或者我觉得把所有代码放在一个函数里会对我有帮助,那么我就会重构代码,做这个。写 bash 脚本时也是这样。

即使你把代码放在主函数里面,也不一定要完全按照那样写。一个不错的变体可以是:

import sys

def main(argv):
    # My code here
    pass

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

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

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

class MyApplication(something):
    # My code here

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

所以,随意写出最适合你的代码。:)

673

如果没有主哨兵(main sentinel),那么即使这个脚本被当作模块导入,代码也会被执行。

撰写回答