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的dict,set,list,tuple应用详解
Jul 24 Python
Python实现的彩票机选器实例
Jun 17 Python
简析Python的闭包和装饰器
Feb 26 Python
python基础教程之匿名函数lambda
Jan 17 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
用python处理图片之打开\显示\保存图像的方法
May 04 Python
简单了解python中对象的取反运算符
Jul 01 Python
Python编程中类与类的关系详解
Aug 08 Python
tensorflow模型保存、加载之变量重命名实例
Jan 21 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
关于tf.matmul() 和tf.multiply() 的区别说明
Jun 18 Python
基于pycharm 项目和项目文件命名规则的介绍
Jan 15 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
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
js下获取div中的数据的原理分析
2010/04/07 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
vue实现一个炫酷的日历组件
2018/10/08 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
使用pkg打包ThinkJS项目的方法步骤
2019/12/30 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
vue实现放大镜效果
2020/09/17 Javascript
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
Python实现的石头剪子布代码分享
2014/08/22 Python
深入Python解释器理解Python中的字节码
2015/04/01 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
HTML5文档结构标签
2017/04/21 HTML / CSS
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
大学生党课思想汇报
2013/12/29 职场文书
自我鉴定写作要点
2014/01/17 职场文书
董事长助理岗位职责
2014/02/18 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
学术研讨会主持词
2015/07/04 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书