上下文管理器和with块,具体内容如下

上下文管理器对象存在的目的是管理 with 语句,就像迭代器的存在是为了管理 for 语句一样。
with 语句的目的是简化 try/finally 模式。这种模式用于保证一段代码运行完毕后执行某项操作,即便那段代码由于异常、 return 语句或 sys.exit() 调用而中止,也会执行指定的操作。 finally 子句中的代码通常用于释放重要的资源,或者还原临时变更的状态。
==上下文管理器协议包含enter和exit两个方法==。 with 语句开始运行时,会在上下文管理器对象上调用enter方法。 with 语句运行结束后,会在上下文管理器对象上调用exit方法,以此扮演 finally 子句的角色。
==执行 with 后面的表达式得到的结果是上下文管理器对象,把值绑定到目标变量上(as 子句)是在上下文管理器对象上调用enter方法的结果==。with 语句的 as 子句是可选的。对 open 函数来说,必须加上 as子句,以便获取文件的引用。不过,有些上下文管理器会返回 None,因为没什么有用的对象能提供给用户。
with open('mirror.py') as fp:
...
自定义的上下文类:
class A:
def __init__(self, name):
self.name = name
def __enter__(self):
print('enter')
return self.name
def __exit__(self, exc_type, exc_val, exc_tb):
print('gone')
with A('xiaozhe') as dt:
print(dt)
contextlib模块
contextlib 模块中还有一些类和其他函数,使用范围更广。
closing:如果对象提供了 close() 方法,但没有实现enter/exit协议,那么可以使用这个函数构建上下文管理器。
suppress:构建临时忽略指定异常的上下文管理器。
@contextmanager:==这个装饰器把简单的生成器函数变成上下文管理器==,这样就不用创建类去实现管理器协议了。
ContextDecorator:这是个基类,用于定义基于类的上下文管理器。这种上下文管理器也能用于装饰函数,在受管理的上下文中运行整个函数
ExitStack:这个上下文管理器能进入多个上下文管理器。 with 块结束时, ExitStack 按照后进先出的顺序调用栈中各个上下文管理器的exit方法。
==使用最广泛的是 @contextmanager 装饰器,因此要格外留心。这个装饰器也有迷惑人的一面,因为它与迭代无关,却要使用 yield 语句==。
使用@contextmanager
@contextmanager 装饰器能减少创建上下文管理器的样板代码量,不用编写一个完整的类定义enter和exit方法,而只需实现有一个 yield 语句的生成器,生成想让enter方法返回的值。
在使用 @contextmanager 装饰的生成器中, yield 语句的作用是把函数的定义体分成两部分: ==yield 语句前面的所有代码在 with 块开始时(即解释器调用enter方法时)执行, yield 语句后面的代码在 with 块结束时(即调用exit方法时)执行==。
import contextlib
@contextlib.contextmanager
def test(name):
print('start')
yield name
print('end')
with test('zhexiao123') as dt:
print(dt)
print('doing something')
实现原理
contextlib.contextmanager 装饰器会把函数包装成实现enter和exit方法的类。类的名称是 _GeneratorContextManager。
这个类的enter方法有如下作用:
1. 调用生成器函数,保存生成器对象(这里把它称为 gen)。
2. 调用 next(gen),执行到 yield 关键字所在的位置。
3. 返回 next(gen) 产出的值,以便把产出的值绑定到 with/as 语句中的目标变量上。
with 块终止时,exit方法会做以下几件事:
1. 检查有没有把异常传给 exc_type;如果有,调用 gen.throw(exception),在生成器函数定义体中包含 yield 关键字的那一行抛出异常。
2. 否则,调用 next(gen),继续执行生成器函数定义体中 yield 语句之后的代码。
异常处理
为了告诉解释器异常已经处理了,exit方法会返回 True,此时解释器会压制异常。如果exit方法没有显式返回一个值,那么解释器得到的是 None,然后向上冒泡异常。
使用 @contextmanager 装饰器时,默认的行为是相反的:装饰器提供的exit方法假定发给生成器的所有异常都得到处理了,因此应该压制异常。 如果不想让 @contextmanager 压制异常,必须在被装饰的函数中显式重新抛出异常。
上面的代码有个bug:如果在 with 块中抛出了异常, Python 解释器会将其捕获,然后在 test 函数的 yield 表达式里再次抛出。但是,那里没有处理错误的代码,因此 test 函数会中止。
使用 @contextmanager 装饰器时,要把 yield 语句放在 try/finally 语句中,因为我们永远不知道上下文管理器的用户会在 with 块中做什么。
import contextlib
@contextlib.contextmanager
def test(name):
print('start')
try:
yield name
except:
raise ValueError('error')
finally:
print('end')
with test('zhexiao123') as dt:
print(dt)
print('doing something')
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Python
# 上下文管理器
# with块
# 详解Python中的with语句和上下文管理器
# python中with语句结合上下文管理器操作详解
# Python中的上下文管理器和with语句的使用
# Python with语句上下文管理器两种实现方法分析
# Python中的with语句与上下文管理器学习总结
# 详解python with 上下文管理器
# Python基础之with语句和上下文管理器详解
# 管理器
# 子句
# 抛出
# 会在
# 的是
# 想让
# 绑定
# 结束时
# 迭代
# 是在
# 也有
# 放在
# 也会
# 有个
# 就像
# 多个
# 目的是
# 也能
# 只需
# 把它
相关文章:
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
建站之星如何助力网站排名飙升?揭秘高效技巧
建站之星后台密码如何安全设置与找回?
营销式网站制作方案,销售哪个网站招聘效果最好?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何通过NAT技术实现内网高效建站?
ppt制作免费网站有哪些,ppt模板免费下载网站?
广州建站公司哪家好?十大优质服务商推荐
建站之星伪静态规则如何正确配置?
如何通过IIS搭建网站并配置访问权限?
建站主机服务器选购指南:轻量应用与VPS配置解析
兔展官网 在线制作,怎样制作微信请帖?
如何通过WDCP绑定主域名及创建子域名站点?
企业微网站怎么做,公司网站和公众号有什么区别?
制作宣传网站的软件,小红书可以宣传网站吗?
全景视频制作网站有哪些,全景图怎么做成网页?
如何访问已购建站主机并解决登录问题?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
香港服务器部署网站为何提示未备案?
建站之星2.7模板:企业网站建设与h5定制设计专题
,想在网上投简历,哪几个网站比较好?
建站主机类型有哪些?如何正确选型
Python如何创建带属性的XML节点
Swift开发中switch语句值绑定模式
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
如何在阿里云香港服务器快速搭建网站?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
免费ppt制作网站,有没有值得推荐的免费PPT网站?
c# 服务器GC和工作站GC的区别和设置
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
建站之家VIP精选网站模板与SEO优化教程整合指南
免费网站制作appp,免费制作app哪个平台好?
清除minerd进程的简单方法
css网站制作参考文献有哪些,易聊怎么注册?
如何在橙子建站上传落地页?操作指南详解
公司网站的制作公司,企业网站制作基本流程有哪些?
网站图片在线制作软件,怎么在图片上做链接?
代刷网站制作软件,别人代刷火车票靠谱吗?
如何快速启动建站代理加盟业务?
如何在企业微信快速生成手机电脑官网?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
建站主机如何选?性能与价格怎样平衡?
如何打造高效商业网站?建站目的决定转化率
nginx修改上传文件大小限制的方法
网站设计制作公司地址,网站建设比较好的公司都有哪些?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何通过虚拟主机快速搭建个人网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。