python中@contextmanager实例用法

在对于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是什么内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python with关键字,上下文管理器,@contextmanager文件操作示例

    本文实例讲述了Python with关键字,上下文管理器,@contextmanager文件操作.分享给大家供大家参考,具体如下: demo.py(with 打开文件): # open 方法的返回值赋值给变量 f,当离开 with 代码块的时候,系统会自动调用 f.close() 方法 # with 的作用和使用 try/finally 语句是一样的. with open("output.txt", "r") as f: f.write("XXXXX&qu

  • python中@contextmanager实例用法

    在对于python中的装饰器,我们一般会使用它辅助方法.在我们学习的上下文管理器中,有一个@contextmanager装饰器,它能够帮助我们在函数中定义上下文管理器方法,实现代码方面的简化.下面我们就python中@contextmanager的概念.使用注意.实例进行分享. 1.概念 是contextlib模块提供的一个装饰器,用于将一个函数声明上下文管理,无需创建一个类或者单独的__enter__()方法和__exit__()方法,就可以实现上下文管理. 2.注意 装饰器@contextm

  • python中waitKey实例用法讲解

    1.说明 用于等待按钮.当用户按下按钮时,句子将被执行并获得返回值. 2.语法 retval=cv2.waitKey([delay]) Retval:表示返回值: Delay:键触发的时间,单位为ms. 3.实例 import cv2 lena=cv2.imread("D:\pmjcv\lena.bmp") cv2.namedWindow("lesson") cv2.imshow("lesson",lena) key=cv2.waitKey()

  • python中subprocess实例用法及知识点详解

    1.subprocess这个模块来产生子进程,并且可以连接到子进程的标准输入.输出.错误中,还可以获得子进程的返回值. 2.subprocess提供了2种方法调用子程序. 实例 # coding:utf-8 import os # popen返回文件对象,同open操作一样 f = os.popen(r"ls", "r") l = f.read() print(l) f.close() Python subprocess知识点扩充 使用subprocess模块的目的

  • python中append实例用法总结

    append()函数 描述:在列表ls最后(末尾)添加一个元素object 语法:ls.append(object) -> None 无返回值 例: a=[1,2,3] a.append(5) 此时,运行结果为 [1, 2, 3, 5] a=[1,2,3] a.append([5]) 此时,运行结果为 [1, 2, 3, [5]] 结果不再为一个数组,而是list 用append生成多维数组: import numpy as np a=[] for i in range(5): a.append

  • Python中max函数用法实例分析

    本文实例讲述了Python中max函数用法.分享给大家供大家参考.具体如下: 这里max函数是Python内置的函数,不需要导入math模块 # 最简单的 max(1, 2) max('a', 'b') # 也可以对列表和元组使用 max([1,2]) max((1,2)) # 还可以指定comparator function max('ah', 'bf', key=lambda x: x[1]) def comparator(x): return x[1] max('ah', 'bf', ke

  • python中pygame模块用法实例

    本文实例讲述了python中pygame模块用法,分享给大家供大家参考.具体方法如下: import pygame, sys from pygame.locals import * #set up pygame pygame.init() windowSurface = pygame.display.set_mode((500, 400), 0, 32) pygame.display.set_caption("hello, world") BLACK = (0, 0, 0) WHITE

  • python中urllib模块用法实例详解

    本文实例讲述了python中urllib模块用法.分享给大家供大家参考.具体分析如下: 一.问题: 近期公司项目的需求是根据客户提供的api,我们定时去获取数据, 之前的方案是用php收集任务存入到redis队列,然后在linux下做一个常驻进程跑某一个php文件, 该php文件就一个无限循环,判断redis队列,有就执行,没有就break. 二.解决方法: 最近刚好学了一下python, python的urllib模块或许比php的curl更快,而且简单. 贴一下代码 复制代码 代码如下: #

  • Python中Class类用法实例分析

    本文实例讲述了Python中Class类用法.分享给大家供大家参考,具体如下: 尽管Python在Function Programming中有着其他语言难以企及的的优势,但是我们也不要忘了Python也是一门OO语言哦.因此我们关注Python在FP上的优势的同时,还得了解一下Python在OO方面的特性. 要讨论Python的OO特性,了解Python中的Class自然是首当其冲了.在Python中定义class和创建对象实例都很简单,具体代码如下: class GrandPa: def __

  • python中元类用法实例

    本文实例讲述了python中元类用法,分享给大家供大家参考.具体方法分析如下: 1.元类(metaclass)是用来创建类的类 2.type(object):返回一个对象的类型,与object.__class__的值相同,type(name,bases,dict):创建一个新的type类型,name就是新class的name,值存到__name__属性中,bases是tuple类型,值会存到__bases__中,dict的值存到__dict__中 复制代码 代码如下: class X: ... 

  • python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成.字典的键必须是不可改变的类型,如:字符串,数字,tuple:值可以为任何python数据类型. 1.新建字典 >>> dict1={} #建立一个空字典 >>> type(dict1) <type 'dict'> 2.增加字典元素:两种方法 >>&g

随机推荐