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中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
python机器学习之决策树分类详解
Dec 20 Python
用Django实现一个可运行的区块链应用
Mar 08 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
Python实战之制作天气查询软件
May 14 Python
python实现LRU热点缓存及原理
Oct 29 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
python自动化unittest yaml使用过程解析
Feb 03 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
利用python清除移动硬盘中的临时文件
Oct 28 Python
聊聊Python String型列表求最值的问题
Jan 18 Python
详解OpenCV曝光融合
Apr 29 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设计模式 Mediator (中介者模式)
2011/06/26 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
Angular 封装并发布组件的方法示例
2018/04/19 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
Pycharm远程调试openstack的方法
2017/11/21 Python
Python绘制七段数码管实例代码
2017/12/20 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
python 将html转换为pdf的几种方法
2020/12/29 Python
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
村优秀党员事迹材料
2014/01/15 职场文书
2014年教师节寄语
2014/08/11 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技