Python上下文管理器
1.与装饰器的区别
上下文管理器是装饰器的近亲,装饰器用于包装函数,上下文管理器用于包装任意代码块.
上下文管理器最常用的场合--作为确保资源被正确清理的一种方式.
2.上下文管理器举例
打开文件-打开文件必须确保其能关闭,这就构成了一种上下文的关系
3.with语句
我们知道with语句打开文件会自动帮我们关闭文件,这个with语句就起到了上下文管理器的作用.下面会介绍原理.
4.__enter__和__exit__方法
with语句会调用对象的__enter__和__exit__方法,在上面的例子中open就是一个对象(Python中一切皆对象).__enter__方法的返回值会赋值给后面的变量.__enter__就是上文管理__exit__就是下文管理.
写一个自己的上下文管理器.
后面会解释__exit__方法中的后三个参数
5.with调用__enter__和__exit__的过程
使用with语句会先调用with后面类的__enter__方法,with语句块结束后会调用__exit__方法
6.处理异常
__exit__方法可以捕获包装代码块中的异常.
对__exit__函数中的参数解释一下:
exc_type:异常类型
exc_val:异常实例
exc_tb:回溯
如果没有异常则以上三个参数均为None
__exit__对异常的处理:
返回True终止异常
返回False传播异常
什么都不return:
output:
return True:
output:
return False:
output:
7.使用场景
关闭资源
比如连接数据库时必须要关闭数据库,像这种打开后必须关闭的操作可以用上下文管理器的操作.
Python连接MySQL数据库的上下文管理器例子:
output:
处理异常
见上条内容
8.contextlib.contextmanager装饰器
可以利用这个装饰器将一个函数变成上下文管理器
output:
divisionby zero
注意:被装饰的函数需要返回单个值(yield)