提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在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 语句通过上下文管理器自动完成资源的获取与释放,确保无论操作中是否出现异常,资源都能被安全管理。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐