首页 > 编程语言 >python中的上下文管理器以及python内建模块contextlib的contextmanager方法

python中的上下文管理器以及python内建模块contextlib的contextmanager方法

时间:2023-02-09 18:11:13浏览次数:43  
标签:__ 管理器 python self contextmanager query return data

上下文管理器

上下文管理器是实现了上下文管理协议的对象,其特有的语法是“with …as”。主要用于保存和恢复各种全局状态,关闭文件等,并为try…except…finally提供了一个方便使用的封装。

上下文管理协议具体来说就是在类里面实现以下两个方法:

_enter_(): 从该方法进入运行时上下文,并返回当前对象或者与运行时上下文相关的其他对象。如果with语句有as关键词存在,返回值会绑定在as后的变量上。

_exit_(exc_type, exc_val, exc_tb): 退出运行时上下文,return True 如果 with 执行体有异常,则不会继续向上抛出异常;return Flase 如果 with 执行体有异常,则继续向上抛出异常。如果在执行with语句体时发生异常,那退出时参数会包括异常类型、异常值、异常追踪信息,否则,3个参数都是None。
下面,我们可以自己定义一个类来通过with进行上下文管理:

class MyContextManager:

    def __enter__(self):
        print("connect to contextmanager")
        return self  # return返回的可以是对象,会绑定给as后面的变量

    def __exit__(self, exc_type, exc_val, exc_tb):
        """__exit__方法中:
                1.如果return False:执行query_data方法有异常,则异常继续往上抛
                2.如果return True:执行query_data方法有异常,则异常不会往上抛
        """
        print('close the contextmanager')
        # return False
        return True

    def query_data(self):
        print('query data')


with MyContextManager() as m:
    m.query_data()

执行以上代码,运行结果如下:

下面,我们在类的query_data方法中增加一个报错的a,当__exit__方法 return True 时,如下:

class MyContextManager:

    def __enter__(self):
        print("connect to contextmanager")
        return self  # return返回的可以是对象,会绑定给as后面的变量

    def __exit__(self, exc_type, exc_val, exc_tb):
        """__exit__方法中:
                1.如果return False:执行query_data方法有异常,则异常继续往上抛
                2.如果return True:执行query_data方法有异常,则异常不会往上抛
        """
        print('close the contextmanager')
        # return False
        return True

    def query_data(self):
        a
        print('query data')


with MyContextManager() as m:
    m.query_data()

运行结果如下:并不会执行 query_data() 方法

当__exit__方法 return False 时,如下:

class MyContextManager:

    def __enter__(self):
        print("connect to contextmanager")
        return self  # return返回的可以是对象,会绑定给as后面的变量

    def __exit__(self, exc_type, exc_val, exc_tb):
        """__exit__方法中:
                1.如果return False:执行query_data方法有异常,则异常继续往上抛
                2.如果return True:执行query_data方法有异常,则异常不会往上抛
        """
        print('close the contextmanager')
        return False
        # return True

    def query_data(self):
        a
        print('query data')


with MyContextManager() as m:
    m.query_data()

运行结果如下:会抛异常,

Python的内建模块 contextlib

对于上下文的管理,python也提供了内建的模块contextlib来实现相同的机制,而且这种通过生成器和装饰器实现的上下文管理器,看起来比with语句和手动实现上下文管理协议更优雅。

from contextlib import contextmanager


class MyContextManager:
    def query_data(self):
        # a
        print('query data')


@ contextmanager  # 有了contextmanager我们就不需要手动实现enter和exit方法
def make_context_manager():
    print('connect to contextmanager')
    yield MyContextManager()  # yield就相当于return,但是不会结束函数,而是暂时挂起,如果我们后续需要的话,继续调用这个函数,会从上次挂起的地方继续执行
    print('close the contextmanager')


with make_context_manager() as mc:
    mc.query_data()

 

标签:__,管理器,python,self,contextmanager,query,return,data
From: https://www.cnblogs.com/yesirya/p/17106617.html

相关文章

  • Python装饰器实例讲解(二)
    Python装饰器实例讲解(二)Python装饰器实例讲解(一)你最好去看下第一篇,虽然也不是紧密的链接在一起参考B站码农高天的视频,大家喜欢看视频可以跳转忽略本文:https://www......
  • Python一切皆对象_ type & object & class
    相比较于Java等静态语言,在Python中一切皆对象的概念更加彻底,函数和类都是对象,这样使得Python更加灵活。下面将对Python中对type、object以及class对关系进行梳理。关系图:......
  • Python中合法标识符需要满足什么条件?
    所谓的标识符就是用户在定义变量的时候,使用的一种名字,也可以说是一种符号,可应用于不同的环境,而且每一个符号都表示着不同的意思。在Python中,对于标识符的定义是有一定要......
  • PYTHON数据容器
    PYTHON数据容器一种可以容纳多份数据的数据类型,容纳的每一份数据称之为1个元素,每一个元素,可以使任意类型的数据数据容器根据特点的不同,分为五类:列表(list)、元组(tupl......
  • python3中,//、/ 的区别
    //:地板除,返回整数结果/:浮点数除法,返回浮点结果例:print(3//2)  #输出1print(3/2)  #输出1.5拓展:判断水仙花数# 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位......
  • python3中,isinstance() 函数
    #isinstance()函数来判断一个对象是否是一个已知的类型,类似type()。#返回值:如果对象的类型与参数二的类型相同则返回True,否则返回False 使用isinstance函数的实例:a=2prin......
  • python selenium.remote远程连接时间达10分钟
    问题:在机器A搭建了selenium-grid的环境,hub以4444端口号启动,并在4444下注册了子node,端口4445,浏览器配置chrome使用代码进行远程连接,并创建会话:传入的server_url= http:......
  • Python教程:selenium模块用法教程
    1.介绍selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如......
  • 一辆车帮你读懂python函数
     函数的概念:有一个超市,a要去买西,走一段距离,b去买东西走一段距离,c去买东西也走一段距离,于是就有了公交车,abc都可以搭这一趟公交车去超市买东西,这里的公交车就是函数。函......
  • OpenCV—python 基于傅里叶变换的图像矫正
    基于傅里叶变换的图像矫正importcv2importnumpyasnpimportmathdeffourier_demo():#1、灰度化读取文件,img=cv2.imread('english_rotation.jpg'......