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通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
Apr 05 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
pandas通过索引进行排序的示例
Nov 16 Python
Python的UTC时间转换讲解
Feb 26 Python
Python中按值来获取指定的键
Mar 04 Python
Python list运算操作代码实例解析
Jan 20 Python
520使用Python实现“我爱你”表白
May 20 Python
详解Python利用configparser对配置文件进行读写操作
Nov 03 Python
搭建pypi私有仓库实现过程详解
Nov 25 Python
Python基础之教你怎么在M1系统上使用pandas
May 08 Python
Python代码风格与编程习惯重要吗?
Jun 03 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 用数组降低程序的时间复杂度
2009/12/04 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
Angular4实现动态添加删除表单输入框功能
2017/08/11 Javascript
JS验证码实现代码
2017/09/14 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
使用Python获取Linux系统的各种信息
2014/07/10 Python
python使用socket进行简单网络连接的方法
2015/04/29 Python
python僵尸进程产生的原因
2017/07/21 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
Python 实现try重新执行
2019/12/21 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
Python自动化测试基础必备知识点总结
2021/02/07 Python
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
党员反对四风问题思想汇报
2014/09/12 职场文书
党员进社区活动总结
2015/05/07 职场文书
感恩主题班会教案
2015/08/12 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
MySQL为id选择合适的数据类型
2021/06/07 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS