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中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
python将ansible配置转为json格式实例代码
May 15 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
Python 对输入的数字进行排序的方法
Jun 23 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
使用python 打开文件并做匹配处理的实例
Jan 02 Python
Python  Django 母版和继承解析
Aug 09 Python
Python中的四种交换数值的方法解析
Nov 18 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
Python实现一个优先级队列的方法
Jul 31 Python
python 如何引入协程和原理分析
Nov 30 Python
你需要掌握的20个Python常用技巧
Feb 28 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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
详细解读PHP中接口的应用
2015/08/12 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
2017/11/28 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
vuejs点击class变化的实例
2018/09/05 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
[00:35]DOTA2上海特级锦标赛 EG战队宣传片
2016/03/04 DOTA
用Python中的字典来处理索引统计的方法
2015/05/05 Python
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
python将数组n等分的实例
2019/12/02 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
使用K.function()调试keras操作
2020/06/17 Python
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
4s店市场专员岗位职责
2014/04/09 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
组工干部演讲稿
2014/09/02 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
环保宣传语大全
2015/07/13 职场文书
求职信如何撰写?
2019/05/22 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书