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网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
Apr 20 Python
使用Python AIML搭建聊天机器人的方法示例
Jul 09 Python
使用Flask集成bootstrap的方法
Jul 24 Python
python3基于TCP实现CS架构文件传输
Jul 28 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
python中sort和sorted排序的实例方法
Aug 26 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 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生成带有雪花背景的验证码
2006/10/09 PHP
PHP函数microtime()用法与说明
2013/12/04 PHP
js类 from qq
2006/11/13 Javascript
js模拟弹出效果代码修正版
2008/08/07 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
简单实现python爬虫功能
2015/12/31 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
销售人员自我评价怎么写
2013/09/19 职场文书
大四学生毕业自荐信
2013/11/07 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
python超详细实现完整学生成绩管理系统
2022/03/17 Python