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")
# 上下文管理器在这里已经自动执行完毕
posted @ 2024-06-14 03:40  Undefined443  阅读(166)  评论(0)    收藏  举报