技术文章 > Python技术 >  Python基础教程 > 正文

python中如何使用@contextmanage?

小妮浅浅

在定义上下文管理器的方法中,我们已经介绍过定义协议的两种方法。不过要想更快的直接实现上下文管理器,还有一种装饰器@contextmanage直接调用即可。我们在对这种装饰器有所了解后,想要使用前需要对它的实现逻辑有一个明确。在掌握了具体的操作过程后,带来装饰器的使用实例。

1、实现逻辑

(1)初始化一个 _GeneratorContextManager 类,构造方法接受了一个生成器 gen

(2)这个类实现了上下文管理器协议 __enter__ 和 __exit__

(3)执行 with 时会进入到 __enter__ 方法,然后执行这个生成器,执行时会运行到 with 语法块内的 yield 处

(4)__enter__ 返回 yield 的结果

(5)如果 with 语法块没有发生异常,with 执行结束后,会进入到 __exit__ 方法,再次执行生成器,这时会运行 yield 之后的代码逻辑

(6)如果 with 语法块发生了异常,__exit__ 会把这个异常通过生成器,传入到 with 语法块内,也就是把异常抛给调用者

2、使用实例

Python中,可以使用装饰器 @contextmanager来简化上下文管理器,也就是不需要定义__enter__和__exit__方法。

class MyContent:
    def query(self):
        print('query data')
# 需要引入contextmanager
from contextlib import contextmanager
 
@contextmanager
def make_resource():
    print('first connect to resource')
    yield MyContent()
    print('close resource connection')
 
#应用上下文管理器
with make_resource() as r:
r.query()

以上就是python中使用@contextmanage的方法,大家在操作之前,一定要先就具体的@contextmanage实现逻辑进行了解,然后再展开相关的实例操作。

免费视频教程
本教程部分素材来源于网络,版权问题联系站长!
相关文章
  python上下文管理器的基本介绍
  python上下文管理器的用法详解
  上下文管理器在python中的原理
  python上下文管理器如何解决异常?
  python中@contextmanager是什么?
相关视频章节
  os & sys 模块使用
  包的使用
  第三方开源模块的安装&使用
  自定义模块
  模块介绍和调用方式
作者信息

小妮浅浅

认证0级讲师

最近文章
python全栈开发是什么 354
python是什么意思啊 135
python工程师是什么 150
推荐视频
视频教程分类