python 上下文管理器的使用

177 阅读1分钟

上下文管理器是什么

python 里,实现了__enter____exit__ 方法的 class。 最常见的上下文管理器,就是利用操作文件时,使用的 open() 函数。 一个上下文管理器,利用with 方法来使用

使用好处

使用场景:在使用对象时,需要在结束任务后,执行一些关闭操作,例如对一个文件操作后,需要将文件关闭,或者在获取一个数据库连接后,要进行关闭操作。 有一个特性是,在 with 代码块中,即使发生了错误,也会执行 __exit__ 方法,这样就能保证关闭操作一定会执行。

自己实现一个上下文管理器

class Context:
    def __init__(self) -> None:
        self.test = 1
    
    def __enter__(self):
        print('__enter__')
        # 这块 return 的对象,可以在 with 之后使用
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        '''
        此方法一定会执行,即使代码出现了错误。
        exc_type, exc_val, exc_tb 是错误类型
        分别代表异常类型,异常值和追溯信息
        如果此方法返回了 True,表示后续代码正常执行,否则就会在执行完 __exit__ 方法后,返回错误 
        '''
        print('__exit__')
        print(exc_type, exc_val, exc_tb)
        return True

with Context() as c:
    print('执行中')
    # c 就是 __enter__ 方法中返回的对象
    print(c.test)
    # 制造一个错误
    1 / 0

返回信息是

__enter__
执行中
1
__exit__
<class 'ZeroDivisionError'> division by zero <traceback object at 0x000002648796D140>

如果将 __exit__ 中的return注释掉的话,会将错误发送出来。

__enter__
执行中
1
__exit__
<class 'ZeroDivisionError'> division by zero <traceback object at 0x000001FA905E0FC0>
Traceback (most recent call last):
  File ".\ppp.py", line 54, in <module>
    1 / 0
ZeroDivisionError: division by zero