iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python编程ContextManager上下文管理器讲解
  • 823
分享到

Python编程ContextManager上下文管理器讲解

2024-04-02 19:04:59 823人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是上下文管理器官方解释简单一句话__enter__(self)__exit__(self, exc_type, exc_value, exc_traceback)有哪些常见上

什么是上下文管理器

官方解释

上下文管理器是一个对象它定义了在执行 with 语句时要建立的运行时上下文上下文管理器处理进入和退出所需的运行时上下文以执行代码块上下文管理器通常使用 with 语句调用,但也可以通过直接调用它们的实例方法来使用

一顿花里胡哨猛如虎,结果我也不太懂

简单一句话

同时包含 __enter__() 和 __exit__() 方法的对象就是上下文管理器

__enter__(self)

进入上下文管理器自动调用的方法

该方法会在 with ... as ... 代码块执行之前执行

如果 with 语句有 as 子句,且该方法有返回值,那么该方法的返回值会被赋值给 as 子句后的变量,最常见的 with open('file_path', 'w') as file: 

该方法可以返回多个值,因此在 as 子句后面也可以指定多个变量(多个变量必须由“()”括起来组成元组)

__exit__(self, exc_type, exc_value, exc_traceback)

退出上下文管理器自动调用的方法,会返回一个布尔类型的值

该方法会在 with ... as ... 代码块执行之后执行

如果 with ... as ... 代码块成功执行结束,程序自动调用该方法,且三个参数都为 None

如果 with ... as ... 代码块执行时发生异常,通过 sys.exc_info() 得到异常信息,三个参数值分别是:异常类型、异常信息、异常回溯信息类型

有哪些常见上下文管理器?

打开文件


with open('file_path', 'w') as file:
    file.write('hello world !')

拆分了解

上下文表达式: with open('file_path', 'w') as file: 

上下文管理器: open('file_path', 'w') 

file:可以理解为资源对象

执行顺序

先执行 open() 的 __enter__() 方法,将返回值赋值给 file

执行 file.write('hello world !') 

最后执行 open() 的 __exit__() 方法

自定义上下文管理器

其实有两种方式

基于类实现上下文管理器

只需要给对象添加一个 __enter__ 和一个 __exit__ 方法


import sys
class Resource:
    def __init__(self, name):
        self.name = name
        print("== 初始化方法 ==")
 
    def __enter__(self):
        print(f"** 进入上下文管理器自动调用:name is {self.name}")
        # 可以返回任意类型的值
        return {"name": self.name}
 
    def __exit__(self, exc_type, exc_val, exc_tb):
        print(f"## 退出上下文管理器自动调用:", sys.exc_info(), exc_type, exc_val, exc_tb)
        if exc_tb is None:
            print("没有异常时关闭资源")
        else:
            print("遇到异常时关闭资源")

通过 with 来调用该上下文管理器

也称为:使用 with ... as ... 管理资源


with Resource("小菠萝") as r:
    print(r)

console 输出结果

== 初始化方法 ==
** 进入上下文管理器自动调用:name is 小菠萝
{'name': '小菠萝'}
## 退出上下文管理器自动调用: (None, None, None) None None None
没有异常时关闭资源

__exit__() 方法的三个参数值都是 None

with 代码块抛出异常


with Resource("异常小菠萝") as r:
    print('[with代码块] 异常之前的代码')
    raise Exception("抛出了 Exception")
    print('[with代码块] ~~~~~~~~异常之后的代码')

console 输出结果

== 初始化方法 ==
** 进入上下文管理器自动调用:name is 异常小菠萝
[with代码块] 异常之前的代码
## 退出上下文管理器自动调用: (<class 'Exception'>, Exception('抛出了 Exception'), <traceback object at 0x10e203200>) <class 'Exception'> 抛出了 Exception <traceback object at 0x10e203200>
遇到异常时关闭资源
Traceback (most recent call last):
  File "/Users/polo/Documents/pylearn/第七章:文件相关/1_上下文管理器.py", line 36, in <module>
    raise Exception("抛出了 Exception")
Exception: 抛出了 Exception

代码块抛出异常的时候,可以看到 __exit__() 方法的三个参数值的确来源于 sys.exc_info() 

总结

  •  无论 with 代码块是否有异常,最终都会自动调用 __exit__() 方法
  • 当抛出异常时,__exit__() 默认返回 None,会重新抛出异常到外面,让 with ... as ... 以外的代码来处理异常
  • 反之,如果返回 True,就会忽略异常,不再对异常进行处理

__exit__() 返回 True


    def __exit__(self, exc_type, exc_val, exc_tb):
        print(f"## 退出上下文管理器自动调用:", sys.exc_info(), exc_type, exc_val, exc_tb)
        if exc_tb is None:
            print("没有异常时关闭资源")
        else:
            print("遇到异常时关闭资源")
            return True
 
 
# 再次运行
with Resource("异常小菠萝") as r:
    print('[with代码块] 抛出异常之前的代码')
    raise Exception
    print('[with代码块] 抛出异常之后的代码')

console 输出结果

== 初始化方法 ==
** 进入上下文管理器自动调用:name is 异常小菠萝
[with代码块] 异常之前的代码
## 退出上下文管理器自动调用: (<class 'Exception'>, Exception('抛出了 Exception'), <traceback object at 0x100e29200>) <class 'Exception'> 抛出了 Exception <traceback object at 0x100e29200>
遇到异常时关闭资源

不再抛出异常

基于生成器实现上下文管理器

通过装饰器 contextlib.contextmanager,来定义自己所需的基于生成器的上下文管理器


from contextlib import contextmanager 
@contextmanager
def file_manager(name, mode):
    try:
        # 1、打开文件
        file = open(name, mode)
        # 2、返回文件资源对象
        yield file
    finally:
        # 3、关闭文件
        file.close() 
with file_manager('a.txt', 'w') as file:
    print(file)
    file.write('hello world')

函数 file_manager() 就是一个生成器

当执行 with as 语句时,获取文件资源对象,生成器暂停执行,返回文件资源对象并赋值给 file

当 with 语句执行完后,生成器继续执行剩余代码,关闭文件,释放资源

总结

  • 基于生成器的上下文管理器时,不再用定义 __enter__() 和 __exit__() 方法
  • 但需要加上装饰器 @contextmanager

 with 语句的教程

https://www.jb51.net/article/172132.htm

以上就是python编程ContextManager上下文管理器讲解的详细内容,更多关于Python编程Context Manager的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python编程ContextManager上下文管理器讲解

本文链接: https://www.lsjlt.com/news/137066.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python编程ContextManager上下文管理器讲解
    目录什么是上下文管理器官方解释简单一句话__enter__(self)__exit__(self, exc_type, exc_value, exc_traceback)有哪些常见上...
    99+
    2024-04-02
  • Python上下文管理器深入讲解
    目录引子概念上下文管理协议(Context Management Protocol)上下文管理器(Context Manager)引子 上下文管理器是一种简化代码的有力方式,其内部也...
    99+
    2022-12-21
    Python上下文管理器 Python上下文
  • Python编程:轻松搞透上下文管理器(Context Manager)
    前言本文聚焦在Python的上下文管理的讲解和应用。还是通过代码实例的方式,对照理解和学习,以达到“多快好省”的理解、掌握和应用。闲话少叙,开始——1.何为上下文管理器上下文管理器是一个对象,它定义了在执行with语句时要建立的运行时上下文...
    99+
    2023-05-14
    编程 管理器 协议
  • 深人了解Python上下文管理器
    目录with语句上下文管理器创建基于类的上下文管理器@contextmanager 装饰器总结下面先来介绍一下with关键字在文件读写中的应用,简单了解上下文管理器的功能。 with...
    99+
    2024-04-02
  • 详解Python中的上下文管理器原理
    目录with语句上下文管理器原理自定义上下文管理器contextmanager 装饰器with语句 在我们日常使用场景中,经常会操作一些资源,比如文件对象、数据库连接、Socket连...
    99+
    2023-03-11
    Python上下文管理器原理 Python上下文管理器使用 Python上下文管理器
  • Python上下文管理器详细使用教程
    目录上下文管理器和with块contextlib模块@contextmanager 装饰器@contextmanager 原理和注意事项with语句会设置一个临时的上下文,交给上下文...
    99+
    2023-02-08
    Python上下文管理器 Python上下文
  • python上下文管理器是什么
    本篇文章给大家分享的是有关python上下文管理器是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python的五大特点是什么python的五大特点:1.简单易学,开发程序...
    99+
    2023-06-14
  • Python深入02 上下文管理器
    上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语法形式是with...as...关闭文件...
    99+
    2023-06-02
  • python上下文管理器怎么解决异常
    这篇文章给大家分享的是有关python上下文管理器怎么解决异常的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌...
    99+
    2023-06-14
  • Python上下文管理器怎么使用
    这篇文章主要介绍了Python上下文管理器怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python上下文管理器怎么使用文章都会有所收获,下面我们一起来看看吧。什么是上...
    99+
    2024-04-02
  • 一文带你搞懂Python上下文管理器
    目录一、什么是上下文管理器二、如何实现上下文管理器1. 通过类实现1)_enter_2)_exit_2. 通过contextlib实现总结一、什么是上下文管理器 我们在处理文件的时候...
    99+
    2024-04-02
  • 上下文管理器和守护线程
    问题内容 我正在从上下文管理器启动一个守护线程,该线程应该每秒发送一次心跳,但由于它在线程中运行,因此如果发生异常,它不会终止上下文管理器。当心跳停止时,如何在上下文管理器中引发异常?...
    99+
    2024-02-06
  • 详解利用上下文管理器扩展Python计时器
    目录一个 Python 定时器上下文管理器了解 Python 中的上下文管理器理解并使用 contextlib创建 Python 计时器上下文管理器使用 Python 定时器上下文管...
    99+
    2024-04-02
  • python上下文管理器怎么实现类
    本篇内容介绍了“python上下文管理器怎么实现类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明通过定义__enter__和__exit...
    99+
    2023-06-20
  • Flask的上下文管理详解
    本篇内容介绍了“Flask的上下文管理详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Flask线程间上下文安全Falsk完成线程安全的原...
    99+
    2023-06-02
  • 详解Python中的with语句和上下文管理器
    目录一、with语句的使用二、上下文管理器三、小结如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 with 关键字的语句,它通常用在什么场景呢?对于系统资源如文件、数据...
    99+
    2024-04-02
  • python上下文管理器协议的实现
    目录前言todo:版本1todo:版本2前言 在上下文管理器协议的过程中,涉及到两个魔术方法__enter__方法 和 __exit__方法 在python中所有实现了上下文管理器协...
    99+
    2024-04-02
  • 我要学python之上下文管理
    上下文管理 我们通常在写jdbc连接的时候都会写打开连接,使用连接,关闭连接。为了把资源合理利用,同时这些打开,关闭的工作是重复的工作,那么这些活能不能交给工具去做呢?答案肯定是可以的,不然怎么会有那么多的数据层中间件呢?我们要说的这个py...
    99+
    2023-01-31
    下文 我要学 python
  • Python中的上下文管理器原理是什么
    这篇“Python中的上下文管理器原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的上下文管理器原理是...
    99+
    2023-07-05
  • python中上下文管理器的原理是什么
    今天就跟大家聊聊有关python中上下文管理器的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WE...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作