Python上下文管理器全实例详解


Posted in Python onNovember 12, 2019

Python上下文管理器

简介

最近用到这个,仔细了解了一下,感觉是十分有用的,记录一下

使用场景

当我们需要获取一个临时打开的资源,并在使用完毕后进行资源释放和异常处理,利用try-catch语句可以完成,举个例子。

打开文件:

f = None
try:
 print("try")
 f = open("__init__.py", "r")
 print(f.read())
except Exception as e:
 print("exception")
finally:
 if f:
  print("finally")
  f.close()

利用上下文管理器:

class OpenHandle:

 def __init__(self, filename, mode):
  self.filename = filename
  self.mode = mode

 def __enter__(self):
  self.f = open(self.filename, self.mode)
  return self.f

 def __exit__(self, exc_type, exc_val, exc_tb):
  if exc_type:
   print("exception")
  else:
   print("normal")
  self.f.close()

with OpenHandle("book.txt", "r") as f:
 print(f.read())

这样可以利用with-as语句改写代码,让程序员关注业务主流程,去掉对于资源的获取和关闭这些重复操作。提升代码的可读性。好处很大。

执行顺序

执行顺序是理解这种写法的关键:

  • 初始化,执行handle的__init__()
  • __enter__()方法,获取资源对象,返回给as后的变量
  • 业务代码逻辑
  • __exit__方法,传入3个参数,异常类型,异常对象,调用栈对象,无异常都为None
  • 抛出异常或者正常结束

函数式上下文管理器

利用from contextlib import contextmanager这个装饰器可以将函数装饰为上下文管理器,其实这个装饰背后也是返回一个实现了__enter__和__exit__方法的类

from contextlib import contextmanager

@contextmanager
def managed_resource(*args, **kwds):
 # Code to acquire resource, e.g.:
 resource = acquire_resource(*args, **kwds)
 try:
  yield resource
 finally:
  # Code to release resource, e.g.:
  release_resource(resource)

>>> with managed_resource(timeout=3600) as resource:
...  # Resource is released at the end of this block,
...  # even if code in the block raises an exception

模板代码

sqlalchemy会话上下文管理器

利用这个管理sqlalchemy会话对象的获取和释放,控制事务是再合适不过了

class DbTransaction:

 def __init__(self, session_maker):
  self.session_maker = session_maker

 def __enter__(self):
  self.session = self.session_maker()
  return self.session

 def __exit__(self, exc_type, exc_val, exc_tb):
  if exc_type:
   self.session.rollback()
  else:
   self.session.commit()
  self.session.close()
  return False if exc_type else True

以上就是全部相关知识点,感谢大家的学习和对三水点靠木的支持。

Python 相关文章推荐
wxpython 学习笔记 第一天
Mar 16 Python
Python XML RPC服务器端和客户端实例
Nov 22 Python
Python中实现变量赋值传递时的引用和拷贝方法
Apr 29 Python
Python读写/追加excel文件Demo分享
May 03 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
Django框架实现的分页demo示例
May 25 Python
django中账号密码验证登陆功能的实现方法
Jul 15 Python
利用Python计算KS的实例详解
Mar 03 Python
基于python纯函数实现井字棋游戏
May 27 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
Python 制作查询商品历史价格的小工具
Oct 20 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 #Python
Python API自动化框架总结
Nov 12 #Python
python的scipy实现插值的示例代码
Nov 12 #Python
python对验证码降噪的实现示例代码
Nov 12 #Python
Python FTP文件定时自动下载实现过程解析
Nov 12 #Python
详解在python操作数据库中游标的使用方法
Nov 12 #Python
如何分离django中的媒体、静态文件和网页
Nov 12 #Python
You might like
Protoss建筑一览
2020/03/14 星际争霸
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
vue中将网页打印成pdf实例代码
2017/06/15 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
Why do we need Unit test
2013/01/03 面试题
中专毕业生自我鉴定范文
2013/11/09 职场文书
上班迟到检讨书
2014/01/10 职场文书
十佳班主任事迹材料
2014/01/18 职场文书
班长竞选演讲稿
2014/04/24 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
IT工程师岗位职责
2014/07/04 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
社区党员干部承诺书
2015/05/04 职场文书
微信搭讪开场白
2015/05/28 职场文书
Python中的min及返回最小值索引的操作
2021/05/10 Python