Python with

1. 什么是with语句?

with是一个用于上下文管理的关键字,在Python 2.5版本引入了这个特性。它提供了一种更加优雅的方式来管理资源,比如文件、网络连接、数据库连接等。通过使用with语句,我们可以确保在进入代码块之前获取资源,并在代码块执行完成后自动释放资源,无论代码块是否发生异常。

2. 使用with语句的好处

使用with语句相比传统的资源管理方式(如使用tryfinally)有以下好处:

  • 代码更简洁: with语句使资源的获取和释放变得简单明了,减少了冗余代码,使代码更易读和维护。
  • 安全性: with语句能够确保资源在正确的时候被释放,即使在代码块中发生异常,资源也能够被正确地释放,避免资源泄漏。
  • 可读性: with语句的代码结构更加清晰,将资源的获取和释放放在一起,使代码的意图更加明确。

3. 使用with语句的示例

让我们看一个使用with语句处理文件的示例:

with open('example.txt', 'r') as file:
    content = file.read()
    print(content)
# 文件在此处自动关闭,无需显式调用file.close()

4. 自定义上下文管理器

除了使用Python内置的上下文管理器(如open()函数返回的文件对象),我们还可以自定义上下文管理器。自定义上下文管理器需要实现__enter__()__exit__()方法。这使得with语句非常灵活,适用于各种资源管理情况。

class MyContext():
    def __enter__(self):
        print('enter')
        return self  # 注意必须要返回自身

    def do_hello(self):
        print(f'hello {self.__class__}')

    def __exit__(self, exc_type, exc_val, traceback):
        print('exit')


if __name__ == '__main__':
    # 1.演示调用流程
    with MyContext() as mc:
        mc.do_hello()  # 此处就算出现异常,__exist__方法也能正常执行

    # Output:
    # enter
    # hello 
    # exit

    # 2.上面代码可以转换成
    mc = MyContext()
    mc.__enter__()
    try:
        mc.do_hello()
    finally:
        mc.__exit__(None, None, None)

4. 多个上下文管理器

在一个代码块中,您还可以使用多个上下文管理器,每个上下文管理器通过逗号分隔。例如,如果您想同时处理多个文件,可以这样做:

with open('file1.txt', 'r') as file1, open('file2.txt', 'r') as file2:
    # 在这里处理file1和file2的内容

5. 其他示例

计时器

import time


class Timer:
    start_time: float = 0.0
    end_time: float = 0.0

    def __enter__(self):
        self.start_time = time.time()
        return self

    def __exit__(self, exc_type, exc_val, traceback):
        self.end_time = time.time()

    @property
    def elapse_time(self):
        return self.end_time - self.start_time


t = Timer()

with t:
    # 模拟耗时
    time.sleep(3)

print(t.elapse_time)

6. 总结

在Python中,with语句提供了一种优雅的方式来管理资源,确保在进入和退出代码块时资源得到正确的分配和释放。它使得代码更加简洁、安全,并提高了可读性。我们可以使用with语句处理文件、数据库连接、网络连接等,也可以自定义上下文管理器来适应各种资源管理场景。通过充分利用with语句,我们可以写出更加优雅和可靠的Python代码。

7. 参考

  • The with statement

你可能感兴趣的:(Python,with,python,__enter__,__exit__)