Python with 语法
with 语句是 Python 中用于简化资源管理的一种语法结构,通常与上下文管理器(Context Manager)一起使用。上下文管理器提供了一种机制,用于确保资源在使用完毕后能够被正确释放,例如文件、网络连接、锁等。
with 语句的基本结构如下:
with expression as variable:
pass
常见用法
文件操作
with 语句可以用于简化文件的打开和关闭操作,确保文件在使用完毕后能够自动关闭。
-
不使用 with 语句
file = open('example.txt', 'r') # 打开文件 try: content = file.read() finally: file.close() # 确保文件关闭 -
使用 with 语句
with open('example.txt', 'r') as file: content = file.read() # 文件在这里已经被自动关闭
数据库连接
类似地,with 语句可以用于管理数据库连接,确保连接在操作完成后能够正确关闭。
-
不使用 with 语句
import sqlite3 conn = sqlite3.connect('example.db') # 连接数据库 try: cursor = conn.cursor() cursor.execute('SELECT * FROM table_name') results = cursor.fetchall() finally: conn.close() # 确保连接关闭 -
使用 with 语句:
import sqlite3 with sqlite3.connect('example.db') as conn: cursor = conn.cursor() cursor.execute('SELECT * FROM table_name') results = cursor.fetchall() # 连接在这里已经被自动关闭
多线程锁
with 语句也可以用于多线程编程中的锁机制,确保锁在操作完成后能够自动释放。
-
不使用 with 语句:
import threading lock = threading.Lock() lock.acquire() # 获取锁 try: pass # 临界区代码 finally: lock.release() # 确保锁释放 -
使用 with 语句:
import threading lock = threading.Lock() with lock: pass # 临界区代码 # 锁在这里已经被自动释放
自定义上下文管理器
你也可以创建自定义的上下文管理器,只需要实现 __enter__ 和 __exit__ 方法。
class MyContextManager:
def __enter__(self):
"""初始化资源"""
print("Entering the context")
return self
def __exit__(self, exc_type, exc_value, traceback):
"""释放资源"""
print("Exiting the context")
# 使用自定义的上下文管理器
with MyContextManager() as manager:
print("Inside the context")
# 上下文管理器在这里已经自动执行 __exit__ 方法
contextlib 模块
Python的 contextlib 模块提供了一些工具,用于简化上下文管理器的创建,例如 contextmanager 装饰器。
from contextlib import contextmanager
@contextmanager
def my_context_manager():
print("Entering the context")
yield # 用于标记上下文的分界点,也可以用来返回资源
print("Exiting the context")
# 使用 contextlib 上下文管理器
with my_context_manager():
print("Inside the context")
# 上下文管理器在这里已经自动执行完毕

浙公网安备 33010602011771号