_ _name_ _ 变量介绍及其在 Python 中的使用

当你浏览 Python 代码时,你很可能已经看到了 __name__ 变量。下面的示例代码展示了它的用法:

if __name__ == '__main__':    main()

在本文中,我想向你展示如何使用此变量在 Python 中创建模块。

为什么要使用 _ _name_ _ 变量

__name__ 变量(前后各两个下划线)是一个特殊的 Python 变量。它的值取决于我们如何执行脚本。

有时,你编写的脚本带有在其他脚本中也可能有用的函数。在 Python 中,你可以将该脚本作为另一个脚本中的模块导入。

由于这个特殊变量,你可以决定是否要运行脚本,或者你想导入脚本中定义的函数。

__name__ 变量可以包含什么值

当你运行脚本时,__name__ 变量等于 __main__。当你导入包含脚本时,它将包含脚本的名称。

让我们来看看这两个用例,并用两个插图描述这个过程。

场景一——运行脚本

假设我们像这样写脚本 nameScript.py

def myFunction():    print 'The value of __name__ is ' + __name__
def main():    myFunction()
if __name__ == '__main__':    main()

如果你运行 nameScript.py,将是下面的过程。

PljpjxnM1OMMW7IkexNxVfwrKhP0RH-isapH

在运行所有其他代码之前,__name__ 变量被设置为 __main__。之后,运行 mainmyFunction def 语句。因为条件评估为真,所以调用了 main 函数。这反过来又调用 myFunction。这将打印出 __main__ 的值。

场景二——在另一个脚本中引入脚本

如果我们想在另一个脚本中重新使用 myFunction,例如 importingScript.py,我们可以将 nameScript.py 作为模块导入。

importingScript.py 中的代码可能如下:

import nameScript as ns
ns.myFunction()

然后我们有两个作用域:一个是 importingScript,另一个是 nameScript。在插图中,你将看到它与第一个用例的不同之处。

k9OxzvJAP-s5qeZg88jUCOCVy1syrQu4oKds

在 importingScript.py 中,__name__ 变量被设置为 __main__。通过导入 nameScript,Python 通过将 .py 添加到模块名称来开始查找文件。然后运行包含在导入文件中的代码。

但是这次它被设置为 nameScript。再次运行 main 和 myFunction 的 def 语句。但是,现在条件评估为 false,并且不调用 main。

在 importingScript.py 中,我们调用 myFunction 来输出 nameScript。当定义该函数时,NameScript 为 myFunction。

如果你要在 importingScript 中打印 __name__,这将输出 __main__。这样做的原因是 Python 使用了 importingScript 范围内的已知值。

小结

在这篇简短的文章中,我解释了如何使用 __name__ 变量来编写模块。你也可以单独运行这些模块。这可以通过利用这些变量的值如何根据位置而变化来实现。

原文:What’s in a (Python’s) __name__? 作者:Bert Carremans