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获取各操作系统硬件信息的方法
Jun 03 Python
Python中map和列表推导效率比较实例分析
Jun 17 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
Python+tkinter模拟“记住我”自动登录实例代码
Jan 16 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
python制作抖音代码舞
Apr 07 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
Jul 13 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
Nov 25 Python
深入理解python协程
Jun 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
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
JavaScript内核之基本概念
2011/10/21 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
node.js下when.js 的异步编程实践
2014/12/03 Javascript
angularjs中的单元测试实例
2014/12/06 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
react中Suspense的使用详解
2019/09/01 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
PyQt5每天必学之组合框
2018/04/20 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
品酒会策划方案
2014/05/26 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
优秀班组申报材料
2014/12/25 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
使用refresh_token实现无感刷新页面
2022/04/26 Javascript