知行编程网知行编程网  2022-12-10 23:00 知行编程网 隐藏边栏  6 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于python上下文是什么的相关知识,希望可以帮到处于编程学习途中的小伙伴


什么是 python 上下文


基本概念



·


上下文管理协议(Context Management Protocol)

包含方法__enter__和__exit__,支持该协议的对象必须实现这两个方法。



·


上下文管理器( Content Manager )

支持上下文管理协议的对象,实现了 __enter__ / __exit__ 方法。上下文管理器定义了with语句执行时要建立的运行时上下文,负责执行with语句块上下文的进入和退出操作。上下文管理器通常使用 with 语句调用。



·


运行时上下文( runtime context )

由上下文管理器创建并由上下文管理器的 __enter 和 __exit__ 方法实现。 __enter方法在语句体执行前进入运行时上下文,__exit__在语句体执行后退出上下文运行时。



·


上下文表达式(Context Expression)

返回上下文管理器对象的 with 语句中关键字 with 后的表达式。



·


语句体(with-body)

with语句包裹的代码块在执行语句体前调用上下文管理器的__enter__方法,语句体执行完后执行__exit__方法。

with不是上下文管理器。with只是一个语句。实现了__enter__和__exit__这两个上下文管理协议方法的对象,都被称作上下文管理器。
上下文管理器被with调用时,会创建运行时上下文,__enter__在语句体执行之前进入运行时上下文,__exit__负责在语句执行完成
之后退出。


with

with语句用上下文管理器定义的方法包装了一段代码的执行,相当于try...except..finally。 with的主要功能相当于finally。


一、多个上下文管理器

with A() as a,B() as b:
  suite


二、上下文管理器类型

上下文管理器是 Python 中的 with 语句用来定义运行时上下文的对象。上下文管理器控制进入/退出运行时上下文的功能。上下文管理器通常以 with 语句开头,也可以直接通过它们的方法调用它们。上下文管理器通常用于保存和恢复各种全局状态、添加和解锁资源以及关闭文件等。


自定义上下文管理器

class TraceBlock:
    def message(self, arg):
        print('running ' + arg)
    def __enter__(self):
        print('starting with block')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is None:
            print('exited normally')
        else:
            print('raise an exception' + str(exc_type))
            return False
if __name__ == '__main__':
    with TraceBlock() as action:
        action.message('test1')
        raise Exception
        print('reached')


上下文装饰器

因为自定义装饰器很麻烦,所以使用 contextlib.contextmanager 将生成器转换为上下文管理器,而无需创建类或单独指定 __enter__ 和 __exit__ 方法。

@contextmanager
def message(arg):
    print('running' + arg)
    yield 
    print('hello')
if __name__ == '__main__':
    with message('hell'):
        print('ok')

装饰器,用于装饰一个生成器函数,使生成器函数被称为上下文管理器。

包含yield的函数就是生成器函数,即contextmanager修饰的函数必须包含yield!

@contextmanager
def make_context():
    print('enter')
    try:
        yield {}
    except Exception as err:
        print('error', err)
    finally:
        print('exit')
if __name__ == '__main__':
    with make_context() as value:
        raise Exception
        print(value)

生成器函数中yield之前的语句在__enter__方法中执行; __exit__中执行yield之后的语句; yield 生成的值赋值给 as 子句中的 variable 变量。如果发生异常,在上面的例子中,可以用except捕获。

python学习网,免费的在线学习
,欢迎关注!

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享