文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python中的with怎么使用

2023-07-05 05:58

关注

今天小编给大家分享一下python中的with怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

简介

with的基本表达式如下

with context_expression [as target(s)]:    ...    with-body

其中context_expression 可以是任意的表达式,as target(s)是可选的

他的执行过程如下

context_manager = context_expressionexit = type(context_manager).__exit__value = type(context_manager).__enter__(context_manager)exc = True   # True 表示正常执行,即便有异常也忽略;False 表示重新抛出异常,需要对异常进行处理try:    try:        target = value  # 如果使用了 as 子句        with-body     # 执行 with-body    except:        # 执行过程中有异常发生        exc = False        # 如果 __exit__ 返回 True,则异常被忽略;如果返回 False,则重新抛出异常        # 由外层代码对异常进行处理        if not exit(context_manager, *sys.exc_info()):            raisefinally:    # 正常退出,或者通过 statement-body 中的 break/continue/return 语句退出    # 或者忽略异常退出    if exc:        exit(context_manager, None, None, None)    # 缺省返回 None,None 在布尔上下文中看做是 False

深入

首先我们来了解两个概念,上下文管理对象与上下文协议

理解完上面的两点,我们就很容易知道with语句的执行流程,我们看着上面的执行过程代码来看

代码

没有报错

class Test:    def __enter__(self):        print("__enter__")        return "hello python"    def __exit__(self, type, value, trace):        print("__exit__")        passdef get_test():    return Test()with get_test() as test:    print(test)

他的打印如下

__enter__
hello python
__exit__

有报错

class Test:    def __enter__(self):        print("__enter__")        return "hello python"    def __exit__(self, type, value, trace):        print("type", type)        print("value", value)        print("trace", trace)        print("__exit__")def get_test():    return Test()with get_test() as test:    print(test)    1 / 0

 打印如下

hello python
type <class 'ZeroDivisionError'>
value division by zero
trace <traceback object at 0x0000024938B07B40>
__exit__
Traceback (most recent call last):
  File "f:/my_profile/study/code_pub/study_code_pub/python/关键字/with.py", line 35, in <module>
    1 / 0

可以看出来当有报错的时候,他是抛出了异常,因为__exit__没有返回值,当他返回True的时候,他的打印如下

当__exit__返回True时

__enter__
hello python
type <class 'ZeroDivisionError'>
value division by zero
trace <traceback object at 0x000001FB117885C0>
__exit__

我们会发现他没有了报错信息。

以上就是“python中的with怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯