为何使用 def main()?
我看到了一些代码示例和教程,它们使用了
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 个回答
如果foo.py的内容是:
print __name__
if __name__ == '__main__':
print 'XXXX'
文件foo.py可以有两种使用方式。
- 在另一个文件中导入:
import foo
在这种情况下,__name__
的值是foo
,这段代码不会被执行,也不会打印XXXX
。
- 直接执行:
python foo.py
当直接执行时,__name__
的值和__main__
是一样的,这段代码会被执行并打印XXXX
。
这个功能的一个用途是在同一个模块中编写各种单元测试。
其他人已经回答过这个问题了,但我觉得我还有一些补充的内容。
关于在 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()
所以,随意写出最适合你的代码。:)
如果没有主哨兵(main sentinel),那么即使这个脚本被当作模块导入,代码也会被执行。