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 相关文章推荐
python抓取网页内容示例分享
Feb 24 Python
python多重继承实例
Oct 11 Python
在Lighttpd服务器中运行Django应用的方法
Jul 22 Python
python追加元素到列表的方法
Jul 28 Python
一篇文章快速了解Python的GIL
Jan 12 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
Django中如何使用sass的方法步骤
Jul 09 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 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
Php做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
WordPress的主题编写中获取头部模板和底部模板
2015/12/28 PHP
通过JAVAScript实现页面自适应
2007/01/19 Javascript
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
python pdb调试方法分享
2014/01/21 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
Python安装OpenCV的示例代码
2020/03/05 Python
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
采购人员的个人自我评价
2014/01/16 职场文书
高中生的自我鉴定范文
2014/01/24 职场文书
餐厅经理岗位职责范本
2014/02/17 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js