菜鸟教程 -- 学的不仅是技术,更是梦想!

Python 3 教程
Python3 教程 Python3 简介 Python3 环境搭建 Python3 VScode Python3 基础语法 Python3 基本数据类型 Python3 数据类型转换 Python3 解释器 Python3 注释 Python3 运算符 Python3 数字(Number) Python3 字符串 Python3 列表 Python3 元组 Python3 字典 Python3 集合 Python3 条件控制 Python3 循环语句 Python3 编程第一步 Python3 推导式 Python3 迭代器与生成器 Python3 with Python3 函数 Python3 lambda Python3 装饰器 Python3 数据结构 Python3 模块 Python __name__ Python3 输入和输出 Python3 File Python3 OS Python3 错误和异常 Python3 面向对象 Python3 命名空间/作用域 Python 虚拟环境的创建 Python 类型注解 Python3 标准库概览 Python3 实例 Python 测验

Python3 高级教程

Python3 正则表达式 Python3 CGI编程 Python3 MySQL(mysql-connector) Python3 MySQL(PyMySQL) Python3 网络编程 Python3 SMTP发送邮件 Python3 多线程 Python3 XML 解析 Python3 JSON Python3 日期和时间 Python3 内置函数 Python3 MongoDB Python3 urllib Python uWSGI 安装配置 Python3 pip Python3 operator Python math Python requests Python random Python OpenAI Python 有用的资源 Python AI 绘画 Python statistics Python hashlib Python 量化 Python pyecharts Python selenium 库 Python 爬虫 Python Scrapy 库 Python Markdown Python sys 模块 Python Pickle 模块 Python subprocess 模块 Python queue 模块 Python StringIO 模块 Python logging 模块 Python datetime 模块 Python re 模块 Python csv 模块 Python threading 模块 Python asyncio 模块 Python PyQt Python for 循环 Python while 循环
(追記) (追記ここまで)

Python with 关键字

在 Python 编程中,资源管理是一个重要但容易被忽视的环节。with 关键字为我们提供了一种优雅的方式来处理文件操作、数据库连接等需要明确释放资源的场景。

with 是 Python 中的一个关键字,用于上下文管理协议(Context Management Protocol)。它简化了资源管理代码,特别是那些需要明确释放或清理的资源(如文件、网络连接、数据库连接等)。


为什么需要 with 语句?

传统资源管理的问题

我们先看一个典型的文件操作示例:

实例

file = open('example.txt', 'r')
try:
content = file.read()
# 处理文件内容
finally:
file.close()

这种写法存在几个问题:

  1. 容易忘记关闭资源:如果没有 try-finally 块,可能会忘记调用 close()
  2. 代码冗长:简单的文件操作需要多行代码
  3. 异常处理复杂:需要手动处理可能出现的异常

with 语句的优势

with 语句通过上下文管理协议(Context Management Protocol)解决了这些问题:

  1. 自动资源释放:确保资源在使用后被正确关闭
  2. 代码简洁:减少样板代码
  3. 异常安全:即使在代码块中发生异常,资源也会被正确释放
  4. 可读性强:明确标识资源的作用域

with 语句的基本语法

基础用法

with 语句的基本形式如下:

语法格式

with expression [as variable]:
# 代码块
  • expression 返回一个支持上下文管理协议的对象
  • as variable 是可选的,用于将表达式结果赋值给变量
  • 代码块执行完毕后,自动调用清理方法

文件操作示例

最常见的 with 语句应用是文件操作:

实例

with open('example.txt', 'r') as file:
content = file.read()
print(content)
# 文件已自动关闭

这段代码等价于前面的 try-finally 实现,但更加简洁明了。


with 语句的工作原理

上下文管理协议

with 语句背后是 Python 的上下文管理协议,该协议要求对象实现两个方法:

  1. __enter__():进入上下文时调用,返回值赋给 as 后的变量
  2. __exit__():退出上下文时调用,处理清理工作

执行流程

异常处理机制

__exit__() 方法接收三个参数:

  • exc_type:异常类型
  • exc_val:异常值
  • exc_tb:异常追踪信息

如果 __exit__() 返回 True,则表示异常已被处理,不会继续传播;返回 FalseNone,异常会继续向外传播。


实际应用场景

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 # 临时设置高精度
# 执行高精度计算
# 精度恢复原设置

创建自定义的上下文管理器

类实现方式

我们可以通过实现 __enter____exit__ 方法创建自定义的上下文管理器:

实例

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(1000000))

使用 contextlib 模块

Python 的 contextlib 模块提供了更简单的方式来创建上下文管理器:

实例

from contextlib import contextmanager

@contextmanager
def tag(name):
print(f"<{name}>")
yield
print(f"</{name}>")

# 使用示例
with tag("h1"):
print("这是一个标题")

输出:

&lt;h1&gt;
这是一个标题
&lt;/h1&gt;

常见问题与最佳实践

常见错误

1、错误地认为 with 只能用于文件:

实例

# 错误:认为只有文件需要with
conn = sqlite3.connect('db.sqlite')
# 应该使用with语句

2、忽略__exit__的返回值:

实例

class MyContext:
def __exit__(self, exc_type, exc_val, exc_tb):
# 忘记返回True/False可能导致异常处理不符合预期
pass

最佳实践

  1. 优先使用 with 管理资源:对于文件、网络连接、锁等资源,总是优先考虑使用 with 语句
  2. 保持上下文简洁:with 块中的代码应该只包含与资源相关的操作
  3. 合理处理异常:在自定义上下文管理器中,根据需求决定是否抑制异常
  4. 利用多个上下文:Python 允许在单个 with 语句中管理多个资源

总结要点

关键点 说明
自动资源管理 with 语句确保资源被正确释放
上下文协议 需要实现 __enter____exit__ 方法
异常安全 即使代码块中出现异常,资源也会被释放
常见应用 文件操作、数据库连接、线程锁等
自定义实现 可以通过类或 contextlib 创建自定义上下文管理器

with 语句是 Python 中一项强大的特性,它不仅能简化代码,还能提高程序的健壮性。掌握 with 语句的使用和原理,将帮助你写出更专业、更可靠的 Python 代码。

AI 思考中...

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /