python中with的具体用法

 更新时间:2023年02月23日 08:32:21   作者:youhebuke225  
本文主要介绍了python中with的基本使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

简介

with的基本表达式如下

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

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

他的执行过程如下

context_manager = context_expression
exit = 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()):
            raise
finally:
    # 正常退出,或者通过 statement-body 中的 break/continue/return 语句退出
    # 或者忽略异常退出
    if exc:
        exit(context_manager, None, None, None)
    # 缺省返回 None,None 在布尔上下文中看做是 False

深入

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

  • 上下文管理器:支持上下文管理协议的对象,这里我们就要知道什么是上下文管理管理协议了,请看第二点。上下文管理器运行with语句是要建立运行的上下文,负责执行with语句块上下文中的进入与退出操作。
  • 上下文管理协议:包含方法__enter__()和__exit__(),支持协议的对象要实现这两个方法

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

  • 执行context_expression ,生成山下文管理器context_manager
  • 调用上下文管理器的__enter__方法,这个时候如果使用了as,那么就会将__enter__方法的返回值赋值给target
  • 执行with-body
  • 不管执行过程中是否发生了异常都会执行上下文管理器的__exit__方法,它用于负责执行清理工作,如释放资源等。
  • 如果执行过程中没有出现异常,或者语句中执行了语句break/continue/return,则以None作为参数调用__exit__(None,None,None);如果执行过程中出现了异常,则使用sys.excinfo得到异常信息作为参数调用__exit__(exc_type,exc_value,exc_traceback)
  • 出现异常时,如果__exit__(exc_type,exc_value,exc_traceback)返回false,则会重新抛出异常,让with完的语句来处理异常,如果__exit__(exc_type,exc_value,exc_traceback)返回True,则异常忽略,不在对于异常来进行处理

代码

没有报错

class Test:
    def __enter__(self):
        print("__enter__")
        return "hello python"

    def __exit__(self, type, value, trace):
        print("__exit__")
        pass

def 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的具体用法的文章就介绍到这了,更多相关python with使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python如何存储数据到json文件

    Python如何存储数据到json文件

    这篇文章主要介绍了Python如何存储数据到json文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • flask框架实现修改密码和免密登录功能

    flask框架实现修改密码和免密登录功能

    flask是python web开发的常用框架之一。本文将讲述flask如何实现修改密码和免密登录功能
    2021-05-05
  • 一文了解Python 流程控制

    一文了解Python 流程控制

    这篇文章主要介绍了一文了解Python 流程控制,Python 中有while和for两种循环机制,其中while循环是条件循环,文章通过展开循环内容展开控制流程详情,需要的小伙伴可以参考一下
    2022-05-05
  • python中实现定时任务的几种方案

    python中实现定时任务的几种方案

    本文呢给大家总结以下几种方案实现定时任务,可根据不同需求去使用不同方案,文章通过代码示例介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴可以参考下
    2023-10-10
  • Python使用pymssql连接SQL SEVER数据库全流程

    Python使用pymssql连接SQL SEVER数据库全流程

    SQL Server是微软推出的重量级的数据库,目前有多个版本,如2000、2008、2012等,下面这篇文章主要给大家介绍了关于Python使用pymssql连接SQL SEVER数据库的相关资料,需要的朋友可以参考下
    2023-12-12
  • Python学习之字典和集合的使用详解

    Python学习之字典和集合的使用详解

    Python 中字典和集合也是非常相近的概念,而且从外观看上去,也有那么一丝丝的相似。本文将从字典基本知识入手,为你展开字典类型数据的各个知识点,需要的可以参考一下
    2022-11-11
  • django中row语法详解

    django中row语法详解

    在Django模板中,使用{{ row }}语法可以输出列表row的所有元素,但是如果你想要输出列表中的某个元素,需要使用下标来访问它,这篇文章主要介绍了django中row语法详解,需要的朋友可以参考下
    2023-06-06
  • pytorch Dataset,DataLoader产生自定义的训练数据案例

    pytorch Dataset,DataLoader产生自定义的训练数据案例

    这篇文章主要介绍了pytorch Dataset, DataLoader产生自定义的训练数据案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python中的图形绘制简单动画实操

    Python中的图形绘制简单动画实操

    这篇文章主要介绍了Python中的图形绘制简单动画实操, Matplotlib 是一个非常广泛的库,它也支持图形动画,动画工具以 matplotlib.animation 基类为中心,它提供了一个框架,围绕该框架构建动画,下面来看看具体的实现过程吧,需要的小伙伴可以参考一下
    2022-02-02
  • Flask WTForms 表单插件的使用

    Flask WTForms 表单插件的使用

    本文主要介绍了Flask WTForms表单插件的使用,Python的WTForms库通过提供表单的结构、验证和渲染等功能,简化了表单的处理流程,感兴趣的可以了解一下
    2023-11-11

最新评论