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 相关文章推荐
python3设计模式之简单工厂模式
Oct 17 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
解决Django一个表单对应多个按钮的问题
Jul 18 Python
Python在Matplotlib图中显示中文字体的操作方法
Jul 29 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
解决python 读取excel时 日期变成数字并加.0的问题
Oct 08 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
Python 生成VOC格式的标签实例
Mar 10 Python
Python手动或自动协程操作方法解析
Jun 22 Python
python实现取余操作的简单实例
Aug 16 Python
Pytest之测试命名规则的使用
Apr 16 Python
JAVA SpringMVC实现自定义拦截器
Mar 16 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程序中防止盗链
2008/04/09 PHP
php与paypal整合方法
2010/11/28 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
php生成html文件方法总结
2014/12/01 PHP
php加密解密字符串示例
2016/10/13 PHP
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
ES6的新特性概览
2016/03/10 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
Kotlin学习第一步 kotlin语法特性
2017/05/25 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
Fiddler如何抓取手机APP数据包
2016/01/22 Python
Python协程的用法和例子详解
2017/09/09 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
解决使用export_graphviz可视化树报错的问题
2019/08/09 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
美国存储和组织商店:The Container Store
2017/08/16 全球购物
高二生物教学反思
2014/01/27 职场文书
信息管理应届生求职信
2014/03/07 职场文书
新农村建设标语
2014/06/24 职场文书
2014年创卫工作总结
2014/11/24 职场文书
九九重阳节致辞
2015/07/31 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
JavaScript组合继承详解
2021/11/07 Javascript
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技