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的Bottle框架的一些使用技巧介绍
Apr 08 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 Python
django认证系统 Authentication使用详解
Jul 22 Python
python英语单词测试小程序代码实例
Sep 09 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
python 下载文件的多种方法汇总
Nov 17 Python
浅谈Python numpy创建空数组的问题
May 25 Python
Python中递归以及递归遍历目录详解
Oct 24 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
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
destoon设置自定义搜索的方法
2014/06/21 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
Document对象内容集合(比较全)
2010/09/06 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
在vue中使用jsx语法的使用方法
2019/09/30 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python解析xml文件实例分析
2015/05/27 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
会议活动邀请函
2014/01/27 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL