当您的脚本作为命令传递给 Python 口译员时,
python myscript.py
缩进级别 0 的所有代码都得到执行。 定义的函数和类别是, 定义的, 定义明确, 但他们的代码没有运行 。 与其他语言不同, 没有main()
函数自动运行 -main()
函数是最高层所有代码的隐含值。
在这种情况下,最高层代码是if
区块。__name__
是一个内嵌变量。该变量对当前模块的名称进行评估。但是,如果模块直接运行,则该模块直接运行(如myscript.py
above), then __name__
而不是设置为字符串"__main__"
因此,您可以测试您的脚本是直接运行的,还是通过测试输入其它东西的脚本。
if __name__ == "__main__":
...
如果您的脚本正在导入到另一个模块中, 它的各种函数和类定义将会导入, 并且它的顶层代码将会被执行, 但是在当时if
以上条款将无法运行,因为不符合条件。作为一个基本例子,考虑以下两个脚本:
# file one.py
def func():
print("func() in one.py")
print("top-level in one.py")
if __name__ == "__main__":
print("one.py is being run directly")
else:
print("one.py is being imported into another module")
# file two.py
import one
print("top-level in two.py")
one.func()
if __name__ == "__main__":
print("two.py is being run directly")
else:
print("two.py is being imported into another module")
如果您现在援引译员为
python one.py
产出将是
top-level in one.py
one.py is being run directly
如果你逃跑two.py
代之以:
python two.py
你得到
top-level in one.py
one.py is being imported into another module
top-level in two.py
func() in one.py
two.py is being run directly
因此,当模块one
装上子弹,装上子弹__name__
等于相等"one"
代替"__main__"
.