本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。
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__方法。
classMyContent: defquery(self): print('querydata') #需要引入contextmanager fromcontextlibimportcontextmanager @contextmanager defmake_resource(): print('firstconnecttoresource') yieldMyContent() print('closeresourceconnection') #应用上下文管理器 withmake_resource()asr: r.query()
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)