关于python:深入理解Python中的上下文管理器和with语句

1次阅读

共计 1822 个字符,预计需要花费 5 分钟才能阅读完成。

Python 的上下文管理器是一种用于封装进入和退出代码块的逻辑的工具,通常通过 with 语句来应用。这个机制能够让咱们更简略、更平安地解决资源和异样。本文将深刻解说 Python 中的上下文管理器和 with 语句。

一、什么是上下文管理器?

上下文管理器是 Python 中的一种对象,用于在代码块执行前后定义一些设置或清理的操作。例如,当关上文件、获取锁或建设数据库连贯等须要清理的操作时,上下文管理器会非常有用。

上下文管理器必须定义两个非凡办法,__enter____exit__,别离在with 语句开始和完结时被调用。

class MyContextManager:
    def __enter__(self):
        print('Entering the block')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('Exiting the block')

二、with 语句如何工作?

with语句是一种异样平安的资源管理语句,它能够与上下文管理器一起应用,以主动解决资源的获取和开释。

with 语句被执行时,会产生以下步骤:

  1. __enter__办法被调用。
  2. 如果 __enter__ 办法返回了一个值,那么这个值会被赋给 as 关键字后的变量。
  3. with语句中的代码块被执行。
  4. 不管代码块是否失常执行结束,__exit__办法总是会被调用。
  5. 如果代码块中产生了异样,异样的类型、值和追踪信息会被传递给 __exit__ 办法。

三、自定义上下文管理器

咱们能够自定义上下文管理器来满足特定的需要。例如,咱们能够创立一个上下文管理器来主动计时:

import time

class TimerContextManager:
    def __enter__(self):
        self.start_time = time.time()

    def __exit__(self, exc_type, exc_val, exc_tb):
        end_time = time.time()
        print(f'Time elapsed: {end_time - self.start_time} seconds')

with TimerContextManager():
    # 模仿耗时操作
    time.sleep(2)

这个上下文管理器会在进入和退出代码块时别离记录时间,而后计算出代码块的运行工夫。

四、contextlib 模块

Python 的 contextlib 模块提供了一些用于创立和解决上下文管理器的实用工具。例如,contextlib.contextmanager装璜器能够将一个生成器函数转换成一个上下文管理器:

from contextlib import contextmanager

@contextmanager
def managed_file(name):
    try:
        f = open(name, 'w')
        yield f
    finally:
        f.close()

with managed_file('hello.txt') as f:
    f.write('Hello, world!')
    f.write('Bye now!')

在这个例子中,managed_file函数负责关上文件并将其传递给 with 语句,with语句完结后,文件会主动敞开。这就防止了遗记敞开文件的危险,并使代码更加简洁。

五、在异步代码中应用上下文管理器

从 Python 3.7 开始,异步上下文管理器被引入到 Python 中,以反对异步 with 语句。异步上下文管理器须要实现 __aenter____aexit__办法。

class AsyncContextManager:
    async def __aenter__(self):
        print('Entering the block')
        return self

    async def __aexit__(self, exc_type, exc_val, exc_tb):
        print('Exiting the block')

async def main():
    async with AsyncContextManager():
        print('Inside the block')

import asyncio
asyncio.run(main())

这在解决诸如异步 IO 操作这样的异步操作时十分有用。

六、论断

上下文管理器和 with 语句是 Python 中十分弱小的工具,它们能够帮忙咱们以更简洁、更平安的形式治理资源和异样。通过了解这些概念并将其利用到你的代码中,你能够编写出更优雅、更强壮的 Python 代码。

正文完
 0