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错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
python语言使用技巧分享
May 31 Python
深入理解python中的闭包和装饰器
Jun 12 Python
python递归删除指定目录及其所有内容的方法
Jan 13 Python
使用实现pandas读取csv文件指定的前几行
Apr 20 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
详解numpy的argmax的具体使用
May 27 Python
TensorFlow MNIST手写数据集的实现方法
Feb 05 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
基于python实现可视化生成二维码工具
Jul 08 Python
python 安装移动复制第三方库操作
Jul 13 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
繁体中文转换为简体中文的PHP函数
2006/10/09 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
浅谈JavaScript中指针和地址
2015/07/26 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
基于JavaScript实现淘宝商品广告效果
2017/08/10 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
python 迭代器和iter()函数详解及实例
2017/03/21 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
python实现决策树分类(2)
2018/08/30 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
护士辞职信范文
2014/01/19 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
2015年招聘工作总结
2014/12/12 职场文书
python通过opencv调用摄像头操作实例分析
2021/06/07 Python
Android自定义双向滑动控件
2022/04/19 Java/Android