按关键词阅读: Python 数据库 上下文管理器 False 返回值
文章插图
说起上下文管理器 , 也许会比较陌生 , 要是说起下面这个例子 , 相信大家都非常熟悉 , 这种打开文件的方式就是使用了上下文管理器 。
文章插图
什么是上下文管理器语法
文章插图
说明
- context_expr:是支持上下文管理协议的对象 , 也就是上下文管理器对象 , 负责维护上下文环境 。
- as var:是一个可选部分 , 通过变量方式保存上下文管理器对象 。
- with_suite:需要放在上下文环境中执行的代码块 。
- 更加优雅的操作资源 , 如文件、数据库操作 。
- 更加优雅的处理异常 。
自定义上下文管理器想实现一个上下文管理 , 首先需要了解什么是上下文管理协议(Context Manager Protocol , 上下文管理协议包括两个方法:
- __enter__():定义上下文管理器在with语句创建的块的开头应该做什么 。 注意 , _enter__的返回值绑定到with语句的目标 , 或者as后面的名称 。
- __exit__(exc_type, exc_val, exc_tb) :定义上下文管理器在其块被执行(或终止)后应该做什么 。 它可以用来处理异常、执行清理 , 或者执行总是在块中的操作之后立即执行的操作 。 如果块执行成功 , exc_type、exc_val和exc_tb将为None 。 否则 , 您可以选择处理异常或让用户处理异常;如果您想处理它 , 请确保在所有操作完成之后 , _exit__返回True 。 如果不想让上下文管理器处理异常 , _exit__返回False , 则会抛出异常 。
接下来 , 动手写一个自定义的上下文管理器 , 示例如下:
文章插图
上述代码执行结果如下:
文章插图
通过日志的打印顺序 , 不难其执行过程 , 在实际应用中 , 可以将资源的连接操作放到__enter__中 , 将资源的关闭操作写在__exit__ 中 。
更加优雅的操作资源在上文中 , 提到上下文管理器常应用的两个场景 , 接下来我们看一下第一个场景 , 更加优雅的操作资源 , 我们在mysql、sqlite等数据库操作时 , 经常涉及链接数据库、执行相关操作、关闭链接等操作 , 让我们上下文管理器是如何优雅的实现数据库链接、执行、关闭操作的 , 如下:
文章插图
如上 , 我们使用上下文管理器优雅的实现数据库的查询 , 执行上述代码 , 输出结果如下:
文章插图
更加优雅的处理异常介绍完了如何更优雅的操作文件/数据库资源 , 接下来 , 看一下上下文管理器常应用到的第二个场景 , 如何更优雅的处理异常 , 如下:
文章插图
以上面的代码为例 , “run parse {1}'.format(self.flag)” 将抛出IndexError 异常 , 接下来我们执行如下代码:
文章插图
执行上述代码 , 输出结果如下:
文章插图
居然没有抛出异常信息 , 程序运行完成 , 使用 with 将异常的处理隐藏起来 , 简化 try/finally 模式 , 使得代码的可读性更高 。 这就是上下文管理协议的一个强大之处 , 异常在__exit__ 中捕获并由我们决定是抛出还是在这__exit__ 中解决 。
在__exit__ 里返回 True(默认为返回False , 即使代码中没有return) , 相当于告诉Python解释器 , 这个异常已经捕获了 , 不需要往外抛了 。 若__exit__ 里返回 False , 则抛出所触发的异常 。 如下
文章插图
执行上述代码 , 输出结果如下:
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J2T962020.html
标题:上下文管理器|更加优雅的操作系统资源与处理异常,深入理解Python上下文管理器