initial vault sync
This commit is contained in:
96
05 投资交易/if __name__ == __main__ 是什么意思?怎么应用?.md
Normal file
96
05 投资交易/if __name__ == __main__ 是什么意思?怎么应用?.md
Normal file
@ -0,0 +1,96 @@
|
||||
#Python学习 #DeepSeek
|
||||
|
||||
|
||||
`if __name__ == "__main__":` 是 Python 中用于区分模块是作为**主程序运行**还是被**其他模块导入**的关键语法。其核心逻辑和用途如下:
|
||||
|
||||
---
|
||||
|
||||
### 一、核心原理
|
||||
|
||||
1. **`__name__` 变量的值由运行方式决定**
|
||||
|
||||
- 当文件**直接运行**(如命令行执行 `python script.py`),`__name__` 被自动设为 `"__main__"`。
|
||||
- 当文件被**其他模块导入**(如 `import script`),`__name__` 变为**模块名**(即文件名,不含 `.py` 后缀)[1,3,5,8](https://tencent.yuanbao/@ref)。
|
||||
2. **条件判断的作用**
|
||||
`if __name__ == "__main__":` 检查当前模块是否为主程序入口:
|
||||
|
||||
- 若成立(直接运行),执行其下方代码块。
|
||||
- 若不成立(被导入),跳过该代码块[3,8](https://tencent.yuanbao/@ref)。
|
||||
|
||||
---
|
||||
|
||||
### 二、典型应用场景
|
||||
|
||||
1. **隔离测试代码**
|
||||
在开发模块时,将测试代码放在此条件下,避免被导入时自动执行:
|
||||
|
||||
```
|
||||
# math_utils.py
|
||||
def add(a, b):
|
||||
return a + b
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("测试结果:", add(2, 3)) # 直接运行才输出
|
||||
```
|
||||
|
||||
- 直接运行:输出测试结果。
|
||||
- 被导入时:仅提供 `add()` 函数,不输出测试内容[1,8](https://tencent.yuanbao/@ref)。
|
||||
2. **避免导入时的副作用**
|
||||
防止导入模块时意外执行耗时操作(如初始化连接、打印日志):
|
||||
|
||||
```
|
||||
# database.py
|
||||
import psycopg2
|
||||
|
||||
def connect():
|
||||
return psycopg2.connect("dbname=test") # 仅定义函数
|
||||
|
||||
if __name__ == "__main__":
|
||||
conn = connect() # 直接运行才建立连接
|
||||
print("连接成功")
|
||||
```
|
||||
|
||||
导入该模块不会触发数据库连接,节省资源[6](https://tencent.yuanbao/@ref)。
|
||||
|
||||
3. **定义命令行程序入口**
|
||||
在大型项目中,将主逻辑封装为 `main()` 函数,通过此条件调用:
|
||||
|
||||
```
|
||||
def main():
|
||||
# 主程序逻辑(如处理参数、启动服务)
|
||||
...
|
||||
|
||||
if __name__ == "__main__":
|
||||
main() # 直接运行时启动
|
||||
```
|
||||
|
||||
其他文件可安全导入该模块复用函数,而不会自动启动程序[3,5](https://tencent.yuanbao/@ref)。
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 三、类比理解
|
||||
|
||||
- **主角模式**:文件直接运行时是“主角”(`__name__` 为 `"__main__"`),执行专属任务(如测试、启动)。
|
||||
- **配角模式**:文件被导入时是“配角”(`__name__` 为模块名),仅提供工具函数,不抢戏[3,8](https://tencent.yuanbao/@ref)。
|
||||
|
||||
---
|
||||
|
||||
### 四、常见错误纠正
|
||||
|
||||
- **误写为赋值语句**:
|
||||
正确写法是 `__name__ == "__main__"`(双等号 `==` 比较),而非 `__name__ = "__main__"`(单等号是赋值)[2](https://tencent.yuanbao/@ref)。
|
||||
- **误解作用范围**:
|
||||
即使模块被其他文件导入过,只要直接运行它,`__name__` 仍为 `"__main__"`[5](https://tencent.yuanbao/@ref)。
|
||||
|
||||
---
|
||||
|
||||
### 总结
|
||||
|
||||
`if __name__ == "__main__":` 是 Python 模块化编程的**最佳实践**,它:
|
||||
|
||||
1. 允许文件**同时具备两种角色**(独立脚本 + 可导入模块)。
|
||||
2. 提升代码的**复用性**(导入时不触发额外操作)和**安全性**(避免副作用)。
|
||||
3. 明确程序的**执行入口**,便于维护[1,3,6](https://tencent.yuanbao/@ref)。
|
||||
|
||||
**示例**:在模块中定义工具函数后,用此条件包裹测试代码,即可一键验证功能,同时确保其他导入模块的代码不受干扰。
|
||||
Reference in New Issue
Block a user