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类的动态修改的实例方法
Mar 24 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
Python决策树之基于信息增益的特征选择示例
Jun 25 Python
python 列表降维的实例讲解
Jun 28 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
解决Python运行文件出现out of memory框的问题
Dec 03 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
Python中变量的输入输出实例代码详解
Jul 28 Python
Python递归函数 二分查找算法实现解析
Aug 12 Python
Python字符串处理的8招秘籍(小结)
Aug 13 Python
Python 中 Shutil 模块详情
Nov 11 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获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
实例讲解php数据访问
2016/05/09 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
jquery 3D球状导航的文章分类
2010/07/06 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
[05:02]2014DOTA2 TI中国区预选赛精彩TOPPLAY第三弹
2014/06/25 DOTA
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
初三化学教学反思
2014/01/23 职场文书
高二生物教学反思
2014/01/27 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
一帮一活动总结
2014/05/08 职场文书
标准版离职证明书
2014/09/12 职场文书
学校教学管理制度
2015/08/06 职场文书
SQL SERVER实现连接与合并查询
2022/02/24 SQL Server
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript