【问题标题】:What does `if name == "__main__"` mean in Python? [duplicate]`if name == "__main__"` 在 Python 中是什么意思? [复制]
【发布时间】:2012-01-03 22:08:39
【问题描述】:

可能重复:
What does <if name==“main”:> do?

我用 Python 编写脚本已经有一段时间了,我会根据需要学习更多的 Python。在阅读其他人的代码时,我经常遇到if name == "__main__": 构造。

它有什么好处?

【问题讨论】:

  • 哦,我明白了...if __name__="__main__": 检查脚本是独立的还是模块的。
  • 对于复制粘贴和/或避免混淆,请注意前一条评论中的错字:if __name__=="__main__":

标签: python module scope


【解决方案1】:

基本上,

“主”脚本文件与以其他方式导入或引用的外部文件之间存在区别。如果脚本是“主”脚本,那么特殊变量 __name__ 将等于 "__main__"

您可以使用它来保护“执行”代码免受脚本所具有的类和变量的影响。这使您能够导入脚本并使用类和变量,而无需实际运行该脚本的主代码(如果有的话)。

另请参阅:What does if name == “main”: do?

【讨论】:

  • 奖励琐事:如果您导入一个恰好名为“main”的模块,您会在 name 中找到什么?
【解决方案2】:

这允许您将同一文件用作库(通过导入它)或作为应用程序的起点。

例如,考虑以下文件:

# hello.py
def hello(to=__name__):
    return "hello, %s" % to

if __name__ == "__main__":
    print hello("world")

您可以通过两种方式使用该代码。一方面,您可以编写一个导入它的程序。如果您导入库,__name__ 将是库的名称,因此检查将失败,代码将不会执行(这是所需的行为):

#program.py
from hello import hello # this won't cause anything to print
print hello("world")

如果您不想编写第二个文件,可以直接从命令行运行代码,如下所示:

$ python hello.py
hello, __main__

这种行为完全取决于特殊变量__name__,python 将根据库是导入的还是直接由解释器运行来设置该变量。如果直接运行,它将被设置为__main__。如果导入,它将被设置为库名称(在本例中为hello)。

此构造通常用于将单元测试添加到您的代码中。这样,当您编写一个库时,您可以将测试代码直接嵌入文件中,而不必担心在以正常方式使用该库时它会被执行。当您想测试库时,不需要任何框架,因为您可以像运行程序一样运行库。

另见__main__ in the python documentation(尽管它非常稀疏)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 2015-02-13
    • 2014-02-25
    • 2019-04-15
    • 2020-03-26
    • 2019-12-17
    • 2011-12-23
    • 2013-01-30
    相关资源
    最近更新 更多