一种机制,允许脚本以不同的方式运行,这取决于作为独立的程序执行还是作为模块被其他脚本导入。这种机制就是 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 | 小红书

Python if __name__ == "__main__" 解释的更多相关文章

  1. 【转】浅析python 中__name__ = '__main__' 的作用

    原文链接:http://www.jb51.net/article/51892.htm 举例说明解释的非常清楚,应该是看到的类似博文里面最简单的一篇: 这篇文章主要介绍了python 中__name__ ...

  2. 浅析python 中__name__ = '__main__' 的作用

    引用http://www.jb51.net/article/51892.htm 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码 ...

  3. 对于python的__name__="__main__"的含义的理解

    学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main ...

  4. 002_浅析python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  5. 理解 python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  6. python的__name__ == \'__main__\' 意义

    转自http://www.jb51.net/article/51892.htm 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码 ...

  7. python基础8之自定义模块、if __name__==__main__:解释

    一.自定义模块与使用 python模块说明:类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  8. 关于python中__name__=='__main__'的解释

    调用文章是:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318451 ...

  9. 谈谈python 中__name__ = '__main__' 的作用

    最近刚刚学习python,看到别人的源代码中经常出现这样一个代码段: if __name__ = '__main__' dosomting() 觉得很晕,不知道这段代码的作用是什么,后来上网查了一些资 ...

  10. python if __name__ == '__main__'解析

    废话不多说,正题: python中所有的模块都有一个内置属性 __name__,一个模块的 __name__ 的值取决于如何应用模块.如果 import 一个模块,那么模块__name__ 的值通常为 ...

随机推荐

  1. day02模板与配置

    一.WXML模板语法 1.1 数据绑定 绑定内容 跟vue差不多,在页面的js文件定义到data里面 然后通过插值语法用在wxml中即可 绑定属性 直接写上插值语法,没有: 三元运算 生成一个十以内的 ...

  2. Basic_pentesting_1靶机渗透流程

    Basic_pentesting_1 Description This is a small boot2root VM I created for my university's cyber secu ...

  3. Oracle自定义数据类型

    1 CREATE OR REPLACE FUNCTION split(p_str IN clob, 2 p_delimiter IN VARCHAR2 default (',') --分隔符,默认逗号 ...

  4. .NET 9 预览版 5 发布

    微软在6月发布了.NET 9预览版的第五个版本.这个新版本的框架预计将在今年晚些时候正式发布,它是一个标准支持(STS)版本,将在2024年11月12日至2026年5月12日期间在多个操作系统上获得1 ...

  5. Kolla-ansible部署openStack

    目录 Kolla-ansible部署openStack 1. 简介 2. 环境准备 3. 部署 3.1 基础环境配置 3.1.1 配置主机名,所有节点操作,这里以openstack01为例 3.1.2 ...

  6. openGL之多线程渲染

    随着Vulkan的引入,我们的图形技术的发展到达了一个新的顶点,但是呢,我们的老干爹OpenGL作为落日余晖,他在一些Vulkan才有的新功能上,也提供了一些支持,现在我们来讨论一下OpenGL之多线 ...

  7. 安装jieba中文分词库

    插入一条: 有个更快安装下载jieba的方法,用镜像下载,非常快,2秒就行 pip install jieba -i https://pypi.douban.com/simple/ 1.打开官方网站: ...

  8. XXL-JOB分片执行分布式任务

    XXL-JOB相对于springtask来说优点之一就是分布式执行任务,可以在调度中心为执行器分发任务,实现分布式. 分片广播任务即当一个微服务形成集群的时候,任务会完整的下发给每一个执行器.而不像其 ...

  9. 使用git(ee的一个小总结

    我先把后端项目推进了gitee,后面为了方便又想把前端也放在同一个项目里,结果出问题了: 一开始是因为前端项目内包含了.git的文件(这个玩意还是隐藏文件,就是你在idea里其实是看不到他的),导致只 ...

  10. 简单认识APP项目

    manifests:里面只有一个xml,是app运行配置文件 清单文件 <?xml version="1.0" encoding="utf-8"?> ...