网站首页 > 技术文章 正文
在 Python 编程中,with 是一个非常有用的关键字,用的恰到好处可让你省心省力,无后顾之忧。当然,要想用的合适,就需充分认识理解它。直接上干货。
在 Python 中,with 语句用于简化资源管理(如文件操作、数据库连接、线程锁等),确保资源在使用后能被正确释放,即使发生异常也能自动清理。它的核心机制是上下文管理器(Context Manager),通过实现 __enter__ 和 __exit__ 方法,定义进入和退出上下文时的行为。
一、基本用法
1. 语法结构
with 上下文管理器 as 变量:
# 在此代码块中使用资源
# 退出代码块后,资源自动释放
2. 常见场景示例
示例 1:文件操作
用 with open() 自动关闭文件,避免忘记 close():
with open("data.txt", "r") as file:
content = file.read()
# 文件已自动关闭,无需手动调用 file.close()
示例 2:线程锁
确保锁的自动释放:
import threading
lock = threading.Lock()
with lock:
# 临界区代码
print("锁已获取,执行操作")
# 锁已自动释放
二、工作原理:上下文管理器
上下文管理器必须实现以下两个方法:
__enter__(): 进入上下文时调用,返回值会赋给 as 后的变量。
__exit__(exc_type, exc_val, exc_tb): 退出上下文时调用,处理异常和资源释放。
自定义上下文管理器示例
class MyContextManager:
def __enter__(self):
print("进入上下文")
return self # 返回值赋给 as 后的变量
def __exit__(self, exc_type, exc_val, exc_tb):
print("退出上下文")
# 处理异常(若返回 True,则抑制异常)
if exc_type:
print(f"发生异常:{exc_type}, {exc_val}")
return True # 抑制异常
# 使用自定义上下文管理器
with MyContextManager() as cm:
print("正在执行操作")
# raise ValueError("测试异常") # 若抛出异常,会被 __exit__ 捕获
三、使用 contextlib 简化上下文管理器
Python 的 contextlib 模块提供工具(如 @contextmanager 装饰器)简化实现。
示例:生成器实现上下文管理器
from contextlib import contextmanager
@contextmanager
def my_context():
print("进入上下文")
try:
yield "资源对象" # yield 前的代码相当于 __enter__,yield 后的相当于 __exit__
finally:
print("退出上下文")
with my_context() as resource:
print(f"正在使用 {resource}")
四、常见应用场景
1. 数据库连接管理
确保连接自动关闭(如 SQLAlchemy):
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("sqlite:///mydb.sqlite")
Session = sessionmaker(bind=engine)
# 使用 with 管理会话
with Session() as session:
result = session.query(User).all()
# 会话自动提交或回滚并关闭
2. 临时修改全局状态
import sys
from contextlib import redirect_stdout
with open("output.log", "w") as f, redirect_stdout(f):
print("这行内容会被写入 output.log")
3. 计时器
from time import time
from contextlib import contextmanager
@contextmanager
def timer():
start = time()
try:
yield
finally:
print(f"耗时: {time() - start:.2f}s")
with timer():
# 执行耗时操作
sum(range(10**6))
五、注意事项
异常处理
- 如果 __exit__ 返回 True,则 with 块内的异常会被抑制,否则异常会传播。
多层嵌套
- with 支持同时管理多个资源,用逗号分隔:
with open("a.txt") as f1, open("b.txt") as f2:
# 同时操作两个文件
资源释放顺序
- 后进入的上下文先退出(类似栈的 LIFO 顺序)。
六、做一下小结
核心作用:确保资源正确释放,避免资源泄漏。
实现方式:通过类实现 __enter__ 和 __exit__,或使用 @contextmanager 装饰器。
典型场景:文件操作、数据库连接、锁管理、临时状态修改等。
通过合理使用 with,可以大幅提升代码的健壮性和可读性!
好了,会用了吧。
爱学习的小伙伴,关注不迷路哟~
猜你喜欢
- 2025-04-30 深入探究Python中`__init__.py`文件的奥秘
- 2025-04-30 Python基础教程 第6课 Input()函数的使用
- 2025-04-30 python中os模块的12种用法(python os.path模块)
- 2025-04-30 10 个鲜为人知的 Python 可视化概念和技巧
- 2025-04-30 带你了解python 中global的用法(python中globals用法)
- 2025-04-30 python中嵌套使用,及如何避免嵌套地狱
- 2025-04-30 Python高级特性揭秘:14个鲜为人知的编程秘籍
- 2025-04-30 零基础学Python!你准备好了吗?第一章·第七课 变量的用处!
- 2025-04-30 掌握 Python:基本语法(python基本语法总结)
- 2025-04-30 python中range用法详解(python语言range用法)
- 263℃Python短文,Python中的嵌套条件语句(六)
- 262℃python笔记:for循环嵌套。end=""的作用,图形打印
- 261℃PythonNet:实现Python与.Net代码相互调用!
- 256℃Python实现字符串小写转大写并写入文件
- 255℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 115℃原来2025是完美的平方年,一起探索六种平方的算吧
- 96℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 88℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)