zoukankan      html  css  js  c++  java
  • Python上下文管理器

    上下文管理器

    Python 的 with语句支持通过上下文管理器所定义的运行时上下文这一概念。 此对象的实现使用了一对专门方法,允许用户自定义类来定义运行时上下文,在语句体被执行前进入该上下文,并在语句执行完毕时退出该上下文。

    上下文管理器对象

    实现了上下文协议的对象,成为上下文管理器对象,该协议要求对象实现__enter__方法和与之对应的__exit__方法。

    _enter_()

    进入运行时上下文并返回此对象或关联到该运行时上下文的其他对象。 此方法的返回值会绑定到使用此上下文管理器的 with语句的 as 子句中的标识符。

    最常见的是我们对锁和文件的操作,他们支持我们使用上下文协议来访问。

    # open() 将文件转化为文件管理器对象,此时文件对象将会作为__enter__ 方法的返回 给 as 后的 `f`。
    # 在 __exit__ 方法中,自动的执行了 f.close() 方法,为我们关闭了文件。
    
    with open('file.txt', 'r', encoding='utf-8') as f:
        data = f.read()
        
    # 在此需要对异常进行处理,必须要保证无论发生什么情况,文件总是要被顺利的释放 也就是执行 f.close()
    # 这要在__exit__中实现。
    

    _exit_(exc_type, exc_val, exc_tb)

    exc_type 错误类型

    exc_val 错误值

    exc_tb 回溯信息

    return 返回一个布尔值, True 表示已经完美处理,False 出了问题

    当无问题发生时, 返回 True。如果

    在其他情况下三个参数均为 None。自此方法返回一个真值将导致 with语句屏蔽异常并继续执行紧随在 with 语句之后的语句。 否则异常将在此方法结束执行后继续传播。

    在此方法执行期间发生的异常将会取代 with 语句的语句体中发生的任何异常。传入的异常绝对不应当被显式地重新引发 —— 相反地,此方法应当返回一个假值以表明方法已成功完成并且不希望屏蔽被引发的异常。 这允许上下文管理代码方便地检测 __exit__()方法是否确实已失败。

    例子

    class Ghost(object):
        """"""
        def __init__(self, host):
            self.host = host
    
        def __enter__(self):
            print('Create a temporary backup file.')
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb) -> bool:
            """
            exc_type: 错误类型
            exc_val: 错误值
            exc_tb: 回溯信息
            return: 返回一个布尔值, True 表示已经完美处理,False 出了问题 
            """
    
            print('Clean up temporary backup files.')
            return True  # 不应该简单粗暴的返回 True!!! 要依据 参数来确定是 True 或 False
            # 这样写 将不会理会with 内的语句成功与否 Python 都会认为一切 OK 实际开发中这是要命的!
    
        def get_ghost(self):
            print('Storage ghost %s'. % self.host)
    
    
    ghost = Ghost('Master')
    
    with ghost as f:
    
        f.get_ghost()
        
    # Create a temporary backup file.
    # Storage ghost Master.
    # Clean up temporary backup files.
    
  • 相关阅读:
    java客户端集成RocketMq
    java8常见流式操作
    Spring源码架构以及编译
    Rocket消息存储原理
    由二叉树中序和先序遍历求二叉树的结构
    10.14重写ENqUEUE和DEQUEUE,使之能处理队列的下溢和上溢。
    10.12 说明如何用一个数组A[1..n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢,注意PUSH和POP操作的时间应为O(1)。
    用类模板实现对任何类型的数据进行堆栈进行存取操作。
    java struts2+urlrewrite 配置404错误
    c++ sizeof 及别名定义2种示例
  • 原文地址:https://www.cnblogs.com/monkey-code/p/13158744.html
Copyright © 2011-2022 走看看