Python中主函数和/或__name__ == "__main__"检查的作用是什么?

18

我偶尔会在Python脚本中看到以下类似的内容:

if __name__ == "__main__":
    # do stuff like call main()

这有什么意义?


在阅读Python文档后,你可以提出什么具体问题?请参考http://docs.python.org/library/python.html。在阅读本节后,你有哪些*具体*的问题? - S.Lott
5
他的问题似乎已经足够具体。他询问的是那个条件通常是用来做什么的。 - Fragsworth
昨晚我自己也在思考这个问题。 - Poindexter
@Fragsworth: 我看不出这有多“具体”。 “什么意义”的问题是开放式的。 它们不能解决编程问题。 此外,“意义何在”的答案在文档中。 最好提出一个更专注的问题,而不是--琐碎地--文档的一部分。 - S.Lott
这个问题的答案可以很快地通过谷歌找到(可能比花时间打这个问题还要快)。我不明白为什么这个问题已经得到了5次赞(到目前为止)。像这样的问题会产生很多噪音,只是重复已经很容易找到的现有信息。 - new name
好的,好的,我错了(投票关闭)。 - Richard Simões
4个回答

27

将所有重要的Python代码放在函数内部(即不要放在模块顶层)是重要的性能优化和代码组织的重要因素(Python编译器可以更好地优化函数中局部变量的访问,而不能像优化实际上是模块全局变量的"局部"变量那样进行优化,因为后者的语义更为严格)。

只有当当前模块作为“主脚本”运行时(而不是从其他模块导入时),才对该函数进行条件调用,这为包含在模块中的功能块的可重用性提供了潜在的可能性(因为其他模块可以导入它并仅调用相应的函数或类),更重要的是,它支持可靠的单元测试(在测试模块的功能之前,通常需要设置各种外部子系统的模拟和伪造)。


我再也不会把所有的代码放在模块的顶层了。谢谢。 - levesque
这对我来说比那些有数千票的解释更好。即使看了所有的例子,我也真的看不出重点所在。谢谢! - carkod

8

这允许一个Python脚本以合理的方式被导入或独立运行。

如果直接运行Python文件,则__name__变量将包含__main__。如果您导入脚本,那么情况就不是这样了。通常,如果您导入脚本,您想要从文件中调用函数或引用类。

如果没有此检查,导入时任何不在类或函数中的代码都将运行。


7
假设这段代码在main.py中,它的唯一目的是让其他文件可以通过import main引入你的“主”程序中包含的类和函数,而不运行源代码。
如果没有这个条件,全局范围内的代码将在被其他脚本导入时执行。

3

这是一个很好的放置模块测试的位置。只有在从shell直接运行模块时才会运行,但如果被导入,则不会运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接