Python if __name__ == "__main__" 解释

一种机制,允许脚本以不同的方式运行,这取决于作为独立的程序执行还是作为模块被其他脚本导入。这种机制就是 if __name == "__main__"

其作用是控制某些代码块只在该文件作为主程序运行时才执行,而在其被其他模块导入时不执行。

例如 a.py 在 python 直接执行与被 import 作为模块的执行对比:

# a.py
# 在顶层打印 __name__ 全局变量
print(__name__, type(__name__))

if __name__ == "__main__":
    print('As script')
else:
    print('As module')
  1. 如果 a.py 作为脚本使用,则输出:
$ python a.py
__main__ <class 'str'>
As script

$ python -m a
__main__ <class 'str'>
As script
  1. 如果 a.py 作为模块使用,则输出:
In [1]: import a
a <class 'str'>
As module

In [2]: __name__
Out[2]: '__main__'

In [3]: a.__name__
Out[3]: 'a'

这里的解释 模块和脚本的概念及 __name__ 变量

模块和脚本

  • 模块:任何一个包含 python 代码的文件(.py 文件)都可以作为一个模块被其他文件导入。模块可以包含函数、类、变量定义等。
  • 脚本:当直接运行一个 python 文件时,这个文件就被视为一个脚本。

__name__ 变量

  • 当 python 运行一个文件时,它会设置一些特殊变量,__name__ 就是其中之一。这个变量的值取决于该文件是被导入为模块还是作为主脚本执行。
  • 如果文件被当作主脚本执行,__name__ 将被设置为 __main__
  • 如果文件被作为模块导入到其他文件,__name__ 将被设置为模块的名字,如上 a.py -> a

使用 if __name__ == "__main__" 的原因

  • 模块重用:你可能希望你的 文件能够被其他文件导入并重用其中的函数、类等定义,同时,当作为主程序运行时,执行一些测试代码或主要逻辑。

  • 代码组织:这种用法可以帮助你在一个文件中既定义函数、类等,又保持能够执行一些独立的操作,而这些操作仅在该文件作为主程序运行时才进行。

  • 避免意外执行:当你的模块被导入时,防止运行某些不期望在导入时执行的代码。

Good case & Bad case

以下是使用 if __name__ == "__main__" 的好情况和不适宜的情况:

适宜 不适宜
文件既作为独立脚本运行,又作为模块被其他文件导入时 非常简单的脚本,仅用于单次执行或快速任务
测试或示例代码,仅在文件作为主程序运行时执行 在交互式环境(如 Jupyter)中编程,直接运行代码片段更方便
纯粹脚本文件 专门用于定义模块(只包含函数、类定义),不需要直接执行代码
提供清晰的入口点,特别是在构建大型应用或复杂脚本时 开发 python 包或库,主要目的是提供接口和功能,而非执行脚本
--- 进行测试驱动开发(TDD),使用测试框架来执行测试用例

转载自 带你深入理解 Python name main | 小红书

posted @ 2024-01-19 12:57  Undefined443  阅读(8)  评论(0编辑  收藏  举报