python中@contextmanager实例用法


Posted in Python onFebruary 07, 2021

在对于python中的装饰器,我们一般会使用它辅助方法。在我们学习的上下文管理器中,有一个@contextmanager装饰器,它能够帮助我们在函数中定义上下文管理器方法,实现代码方面的简化。下面我们就python中@contextmanager的概念、使用注意、实例进行分享。

1、概念

是contextlib模块提供的一个装饰器,用于将一个函数声明上下文管理,无需创建一个类或者单独的__enter__()方法和__exit__()方法,就可以实现上下文管理。

2、注意

装饰器@contextmanager真正的用法并不是简化上下文管理器,而是去定义上下文管理器的方法,是对原来不是上下文管理器的类变成了一个上下文管理器。

3、实例

from contextlib import contextmanager
import time
@contextmanager
def demo(label):
  start = time.time()
  try:
    yield
  finally:
    end = time.time()
    print('{}: {}'.format(label, end - start))

with demo('counting'):
  n = 10000000
  while n > 0:
    n -= 1
# counting: 1.32399988174

看上面这个例子,函数中yield之前的所有代码都类似于上下文管理器中__enter__方法的内容。而yield之后的所有代码都如__exit__方法的内容。如果执行过程中发生了异常,则会在yield语句触发。

实例扩展:

实例一:

from contextlib import contextmanager
class File():
  def query(self):
    print('查询文件')

@contextmanager
def open():
  print('打开文件')
  yield File()
  print('关闭文件')

with open() as f:
  f.query()
  
# 结果 打开文件 查询文件 关闭文件

实例二:

from contextlib import contextmanager
class DataBase():
  def query(self):
    print('写入操作')
  @contextmanager
  def open(self):
    try:
      yield
      self.commit()
    except Exception as e:
      self.rollback()
      raise e

db = DataBase()
with db.open():
  db.query()

到此这篇关于python中@contextmanager实例用法的文章就介绍到这了,更多相关python中@contextmanager是什么内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现监控windows服务并自动启动服务示例
Apr 17 Python
Python中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
python获取当前日期和时间的方法
Apr 30 Python
python之Character string(实例讲解)
Sep 25 Python
Django logging配置及使用详解
Jul 23 Python
Python魔法方法 容器部方法详解
Jan 02 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
Django serializer优化类视图的实现示例
Jul 16 Python
python对批量WAV音频进行等长分割的方法实现
Sep 25 Python
python中os.remove()用法及注意事项
Jan 31 Python
在Django中使用MQTT的方法
May 10 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 #Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 07 #Python
Python中全局变量和局部变量的理解与区别
Feb 07 #Python
Python抖音快手代码舞(字符舞)的实现方法
Feb 07 #Python
Python图像处理之膨胀与腐蚀的操作
Feb 07 #Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 #Python
python数据抓取3种方法总结
Feb 07 #Python
You might like
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
用PHP代码给图片加水印
2015/07/01 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
获取input标签的所有属性的方法
2016/06/28 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
2016/07/07 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
layui实现数据分页功能
2019/07/27 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
正规的求职信范文分享
2013/12/11 职场文书
大二自我鉴定
2014/01/31 职场文书
事业单位鉴定材料
2014/05/25 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
护理实习生带教计划
2015/01/16 职场文书
结婚纪念日感言
2015/08/01 职场文书
感恩的心主题班会
2015/08/12 职场文书