96 lines
3.6 KiB
Markdown
96 lines
3.6 KiB
Markdown
#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)。
|
||
|
||
**示例**:在模块中定义工具函数后,用此条件包裹测试代码,即可一键验证功能,同时确保其他导入模块的代码不受干扰。 |