Python with 关键字
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在python编程中,资源管理是一个重要的环节,with为我提供了一种方式来处理文件操作、数据库连接等需要明确释放资源的场景
提示:以下是本篇文章正文内容,下面案例可供参考
一、为什么需要with语句?
在python,with语法是一种安全管理资源的语法结构,它能确保在使用完资源后,无论操作过程中是否出现异常,资源都能正常释放
先看一个常见的场景:操作文件
如果不用with,同时是示例这样
#不用with的情况
file=open('example.txt','r')
try:
content=file.read()
finally:
file.close()
print(content)
这时就需要用finally确保file.close()一定会执行,否则可能因一场导致文件未关闭,造成资源泄露
(比如文件被占用而无法删除),使用with语句可以简化这个过程,无需手动调用close
二、with语句的基本语法
语法格式如下:
with 资源获取表达式 as 变量名:
#操作资源的代码块
那么文件使用with的情况如下:
#使用with的情况
with open("example.txt") as file:
content=file.read()#使用文件资源
#代码块结束后,文件自动关闭,无需手动操作
print(content)
进入with块时,会自动“获取资源”(比如打开文件)
离开with块时(无论正常结束还是出错),会自动‘释放资源’(比如关闭文件)
三、with语句的工作原理:上下文管理器
with语句能自动管理资源,核心以上下文管理器(Context Manager)---这是一种实现特殊方法的对象。
上下文管理器必须包含两个方法:
1._enter_():进入with块后获取资源,返回的接轨会赋值给as后的变量
2._exit_():离开with块时调用,负责“释放资源”,即使代码块中出现异常,这个方法也一定会执行
比如open()函数返回的文件对象,就是一个上下文管理器,它内部实现了_enter_():和_exit_()方法,所以能直接用在with语句中

异常处理机制
__exit__() 方法接收三个参数:
exc_type:异常类型exc_val:异常值exc_tb:异常追踪信息
如果 __exit__() 返回 True,则表示异常已被处理,不会继续传播;返回 False 或 None,异常会继续向外传播。
四、实际应用场景
1.文件操作
# 同时打开多个文件
with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile:
content = infile.read()
outfile.write(content.upper())
2.数据库连接
import sqlite3
with sqlite3.connect('database.db') as conn:
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
results = cursor.fetchall()
# 连接自动关闭
3.线程锁
import threading
lock = threading.Lock()
with lock:
# 临界区代码
print("这段代码是线程安全的")
4.临时修改系统状态
import decimal
with decimal.localcontext() as ctx:
ctx.prec = 42 # 临时设置高精度
# 执行高精度计算
# 精度恢复原设置
创建自定义的上下文管理器
这段代码定义了一个自定义的上下文管理器(Timer 类),用于自动计算一段代码的执行时间
class Timer:
def __enter__(self):
import time
self.start = time.time()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
import time
self.end = time.time()
print(f"耗时: {self.end - self.start:.2f}秒")
return False
# 使用示例
with Timer() as t:
# 执行一些耗时操作
sum(range(100000000))
总结
Python 中的 with 语句通过上下文管理器自动完成资源的获取与释放,确保无论操作中是否出现异常,资源都能被安全管理。
更多推荐



所有评论(0)