一种机制,允许脚本以不同的方式运行,这取决于作为独立的程序执行还是作为模块被其他脚本导入。这种机制就是 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. 【仿真】Carla之Docker 运行 及 渲染相关 [6]

    参考与前言 carla官方对于docker 运行的描述: CARLA in Docker Docker的使用:[暂时没贴] 相关已知issue,欢迎补充 https://github.com/carl ...

  2. Nuxt3 的生命周期和钩子函数(十)

    title: Nuxt3 的生命周期和钩子函数(十) date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要:本文详细介绍了Nu ...

  3. 【java深入学习第1章】深入探究 MyBatis-Spring 中 SqlSession 的原理与应用

    前言 在使用 MyBatis 进行持久层开发时,通常会与 Spring 框架集成,以便更好地管理事务和依赖注入.在 MyBatis-Spring 集成中,SqlSession 是一个非常重要的概念.本 ...

  4. python tkinter | 如何使得entry文本框靠右显示,从右向左填充,显示文本末尾

    from tkinter import * from tkinter import filedialog app = Tk() app.title("ABC") app.geome ...

  5. 外部网关协议BGP

    不能全部使用RIP与OSPF的原因有二:互联网规模太大,自治系统间路由选择困难:自治系统间路由选择必须考虑有关策略. 在每一个自治系统中有两种不同功能的路由器,边界路由器和内部路由器. BGP四种报文 ...

  6. [rCore学习笔记 011]第1章作业题

    编程题 第一题 在homework文件夹下创建homework-1-1,使用cargo创建工程: cargo new getFileName 在src下创建file_name.rs文件: // /ho ...

  7. 结构体_C

    // Code file created by C Code Develop #include "ccd.h" #include "stdio.h" #incl ...

  8. 【楔子】单细胞测序-最佳的分析Pipeline

    作者:starlitnightly 日期:2023.07.14 !!! note 楔子 从事单细胞分析也有一段时间了,国内大部分中文教程都是使用R语言进行分析,使用Python的还比较少,或者是直译s ...

  9. Django+Bootstrip 卡片模板设计 经典精品

    下面是一个完整的卡片模板代码,包含所有元素,并使用Django的模板语言来处理状态字段的条件渲染.同时还包括示例视图和URL配置. 完整的卡片模板 <div class="card&q ...

  10. 三星app移植修复(app反编译修改)

    工具: apktool ADT 命令: 反编译 java -jar apktool.jar d test.apk 重打包 java -jar apktool.jar b test 签名使用ADT sm ...