__main__ --- 最高层级代码环境

在 Python 中,特殊名称__main__被用于两个重要的构造:

  • 程序的最高层级环境的名称,可以使用__name__ == '__main__'表达式来检查它;以及

  • Python 包中的 __main__.py 文件。

这两种机制都有 Python 模块有关;用户如何与它们交互以及它们之间如何交互。 下文将进行详细说明。 如果你还不了解 Python 模块,请查看教程 模块 一节的介绍。

__name__ == '__main__'
当一个 Python 模块或包被导入时,__name__ 会被设为模块的名称。 通常,这将是 Python 文件本身的名称去掉 .py 后缀:

>>>
>>> import configparser
>>> configparser.__name__
'configparser'

如果文件是包的组成部分,则 __name__ 还将包括父包的路径:

>>>
>>> from concurrent.futures import process
>>> process.__name__
'concurrent.futures.process'

不过,如果模块是在最高层级代码环境中执行的,则它的 __name__ 会被设为字符串 '__main__'。

什么是“最高层级代码环境”?

__main__ 是最高层级代码运行所在环境的名称。 “最高层级代码”即用户指定最先启动运行的 Python 模块。 它被称为“最高层级”是因为它将导入程序所需的所有其他模块。 有时“最高层级代码”也被称为应用的 入口点。

最高层级代码环境可以是:

一个交互提示符的作用域:

>>>
>>> __name__
'__main__'

作为文件参数传给 Python 解释器的 Python 模块:

$ python3 helloworld.py
Hello, world!

作为 -m 参数传给 Python 解释器的 Python 模块或包:

$ python3 -m tarfile
usage: tarfile.py [-h] [-v] (...)

Python 解释器从标准输入中读取的 Python 代码:

$ echo "import this" | python3
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...

作为 -c 参数传递给 Python 解释器的 Python 代码:

$ python3 -c "import this"
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...

在以上每个情形中,顶级模块的 __name__ 被设置为 '__main__'

因此,一个模块可以通过检查自己的 __name__ ,来发现它是否在顶层环境中运行。这是允许在模块没有从导入语句中初始化的情况下,有条件地执行代码的一个常见的语句:

if __name__ == '__main__':
    # Execute when the module is not initialized from an import statement.
    ...

这就是 if __name__ == '__main__' 代码块的用武之地。除非模块在顶层环境中被执行,否则该块内的代码不会运行。

posted @ 2022-10-13 23:12  码上的生活  阅读(56)  评论(0编辑  收藏  举报