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正则表达式修复网站文章字体不统一的解决方法
Feb 21 Python
Python Socket传输文件示例
Jan 16 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
Python延时操作实现方法示例
Aug 14 Python
修改python plot折线图的坐标轴刻度方法
Dec 13 Python
Python 数据库操作 SQLAlchemy的示例代码
Feb 18 Python
Python3.5内置模块之random模块用法实例分析
Apr 26 Python
python动态文本进度条的实例代码
Jan 22 Python
详解django中Template语言
Feb 22 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 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 fread()使用技巧
2010/01/22 PHP
PHP 图像尺寸调整代码
2010/05/26 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
BootStrapValidator校验方式
2016/12/19 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
Python爬取网易云音乐热门评论
2017/03/31 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Python with标签使用方法解析
2020/01/17 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
军神教学反思
2014/02/04 职场文书
土木工程专业推荐信
2014/02/19 职场文书
2014年计生标语
2014/06/23 职场文书
2014学生会工作总结报告
2014/12/02 职场文书