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实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
python实现在每个独立进程中运行一个函数的方法
Apr 23 Python
在Python中使用HTML模版的教程
Apr 29 Python
高效使用Python字典的清单
Apr 04 Python
python获取当前目录路径和上级路径的实例
Apr 26 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
May 10 Python
Python lambda表达式filter、map、reduce函数用法解析
Sep 11 Python
python删除某个目录文件夹的方法
May 26 Python
Python 字典中的所有方法及用法
Jun 10 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
May 20 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
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
PHP的SQL注入过程分析
2012/01/06 PHP
PHP实现数组递归转义的方法
2014/08/28 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
jquery根据name属性查找的小例子
2013/11/21 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
js+canvas实现纸牌游戏
2020/03/16 Javascript
django 按时间范围查询数据库实例代码
2018/02/11 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
python入门之井字棋小游戏
2020/03/05 Python
python实现FTP循环上传文件
2020/03/20 Python
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
护士辞职信范文
2014/01/19 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
办公室岗位职责
2014/02/12 职场文书
邀请书模板
2015/02/02 职场文书
党员公开承诺书2016
2016/03/24 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers