Python之with语句

文章目录

Python中的with语句详解

with语句是Python中用于资源管理的关键语句,它简化了异常处理中资源分配和释放的操作,特别是对于文件操作、数据库连接、线程锁等需要明确释放资源的场景。

一、基本语法

python 复制代码
with expression [as variable]:
    with-block

二、工作原理

with语句背后的工作机制依赖于上下文管理器协议 ,即实现了__enter__()__exit__()方法的对象。

  1. 执行expression,获取上下文管理器对象
  2. 调用上下文管理器的__enter__()方法
  3. 如果有as variable,则将__enter__()的返回值赋给variable
  4. 执行with-block中的代码
  5. 无论是否发生异常,都会调用上下文管理器的__exit__()方法

三、文件操作中的with语句

1. 基本用法

python 复制代码
with open('example.txt', 'r') as file:
    content = file.read()
    # 不需要手动调用file.close()

2. 同时打开多个文件

python 复制代码
with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile:
    content = infile.read()
    outfile.write(content.upper())

四、with语句的优势

  1. 自动资源管理:确保文件等资源被正确关闭
  2. 异常安全 :即使在with块中发生异常,资源也会被正确释放
  3. 代码简洁 :减少了try-finally块的嵌套
  4. 可读性强:明确显示了资源的生命周期

五、自定义上下文管理器

1. 基于类的实现

python 复制代码
class MyContextManager:
    def __enter__(self):
        print("进入上下文")
        return self  # 可以返回其他对象
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("退出上下文")
        if exc_type:  # 如果有异常发生
            print(f"异常类型: {exc_type}")
            print(f"异常值: {exc_val}")
        # 返回True表示异常已被处理,False或None会向上传播异常
        return True

with MyContextManager() as cm:
    print("在上下文中")
    # 1/0  # 取消注释会触发异常

2. 使用contextlib模块

python 复制代码
from contextlib import contextmanager

@contextmanager
def my_context_manager():
    print("进入上下文")
    try:
        yield "资源对象"  # yield前的代码相当于__enter__
    finally:
        print("退出上下文")  # yield后的代码相当于__exit__

with my_context_manager() as resource:
    print(f"正在使用 {resource}")

六、常见应用场景

  1. 文件操作:自动关闭文件
  2. 数据库连接:自动提交/回滚事务并关闭连接
  3. 线程锁:自动获取和释放锁
  4. 临时修改:临时修改系统参数后恢复
  5. 计时操作:自动记录代码块执行时间
python 复制代码
# 计时器示例
import time
from contextlib import contextmanager

@contextmanager
def timer():
    start = time.time()
    try:
        yield
    finally:
        end = time.time()
        print(f"耗时: {end - start:.2f}秒")

with timer():
    # 需要计时的代码
    time.sleep(1)

七、注意事项

  1. with语句中的变量只在with块内有效
  2. 某些资源(如sys.stdin)不支持with语句
  3. 当需要长期保持资源打开时,不应使用with语句
  4. __exit__方法应该正确处理异常或返回True来抑制异常

with语句是Python中编写干净、安全代码的重要工具,合理使用可以显著提高代码的健壮性和可维护性。

相关推荐
武文斌775 分钟前
项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
linux·开发语言·网络·arm开发·数据库·嵌入式硬件·学习
CoderIsArt13 分钟前
SQLite架构
数据库·sqlite
小蕾Java22 分钟前
PyCharm 软件使用各种问题 ,解决教程
ide·python·pycharm
Lucky_Turtle24 分钟前
【PyCharm】设置注释风格,快速注释
python
lixora37 分钟前
银河麒麟高级服务器操作系统(ADM64 版)V10(SP1)搭建 Oracle 19c RAC
数据库
郝学胜-神的一滴41 分钟前
使用Linux的read和write系统函数操作文件
linux·服务器·开发语言·数据库·c++·程序人生·软件工程
kunge1v542 分钟前
学习爬虫第四天:多任务爬虫
爬虫·python·学习·beautifulsoup
萧鼎1 小时前
Python schedule 库全解析:从任务调度到自动化执行的完整指南
网络·python·自动化
哲Zheᗜe༘1 小时前
了解学习MySQL数据库基础
数据库·学习·mysql
Miqiuha1 小时前
sql的表join怎么学?
数据库·sql