python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python with使用

python with使用详解

作者:令狐掌门

with语句是Python中一种用于资源管理的语法结构,主要用于确保资源(如文件、锁、数据库连接等)在使用后被正确释放,即使发生异常也不会遗漏清理操作,本文给大家介绍python with使用,感兴趣的朋友跟随小编一起看看吧

1. Pythonwith语句的原理

with语句是Python中一种用于资源管理的语法结构,主要用于确保资源(如文件、锁、数据库连接等)在使用后被正确释放,即使发生异常也不会遗漏清理操作。它本质上是基于上下文管理器(Context Manager)协议实现的。

核心原理:

如果没有异常,__exit__的参数均为None。这使得with特别适合“获取-使用-释放”模式的操作。

2.with语句的用法

with语句的基本语法:

with 上下文管理器 [as 变量]:
    # 在这里使用资源
    # 块结束时自动清理

示例1:文件操作(最常见用法)

with open('example.txt', 'r') as file:
    content = file.read()
    print(content)
# 文件在with块结束后自动关闭,无需手动调用file.close()

示例2:多上下文管理器

Python支持嵌套或并列使用多个with

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

示例3:处理异常

try:
    with open('nonexistent.txt', 'r') as file:
        print(file.read())
except FileNotFoundError:
    print("文件不存在")

with常用于:

3. 如何定义一个对象使其支持with语句

要让自定义对象支持with,需要实现上下文管理器协议。有两种主要方式:类实现生成器实现(使用contextlib模块)。

方式1:通过类实现__enter__和__exit__

定义一个类,添加__enter____exit__方法。

class MyResource:
    def __init__(self, name):
        self.name = name
        print(f"初始化资源: {name}")
    def __enter__(self):
        print(f"进入with块: 获取资源 {self.name}")
        return self  # 返回对象本身,供as使用
    def __exit__(self, exc_type, exc_value, traceback):
        print(f"退出with块: 释放资源 {self.name}")
        if exc_type is not None:
            print(f"发生异常: {exc_type}")
            return False  # 不抑制异常,让它传播
        return True  # 正常退出
# 用法
with MyResource("数据库连接") as res:
    print(f"使用资源: {res.name}")
    # raise ValueError("模拟异常")  # 可以测试异常处理

输出示例(无异常):

初始化资源: 数据库连接
进入with块: 获取资源 数据库连接
使用资源: 数据库连接
退出with块: 释放资源 数据库连接

方式2:使用contextlib模块的@contextmanager装饰器(基于生成器)

这是一种更简洁的方式,适合临时上下文,不需要定义整个类。

from contextlib import contextmanager
@contextmanager
def my_resource(name):
    print(f"进入with块: 获取资源 {name}")
    yield name.upper()  # yield前的代码相当于__enter__,yield的值供as使用
    print(f"退出with块: 释放资源 {name}")  # yield后的代码相当于__exit__
# 用法
with my_resource("文件锁") as res:
    print(f"使用资源: {res}")

输出:

进入with块: 获取资源 文件锁
使用资源: 文件锁
退出with块: 释放资源 文件锁

注意事项:

通过这些方式,可以为任何需要资源管理的场景自定义with支持。

到此这篇关于python with使用介绍的文章就介绍到这了,更多相关python with使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文