韩漫免费漫画在线观看方法,《好好疼爱里面》免费看,年轻漂亮的女士护士内衣,妈妈醉酒后把我当爸爸电视剧

文章 > Python常见问题 > python上下文是什么

python上下文是什么

头像

爱喝马黛茶的安东尼

2019-11-04 11:59:253143浏览 · 0收藏 · 0评论

基本概念

·上下文管理协议(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

二、上下文管理器类型

context manager 是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__方法中执行;yield之后的语句在__exit__中执行;yield产生的值赋值给as子句中的variable变量。如果有异常产生,在上面的例子中,能够被except捕获。

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

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

蜜桃成熟之三人| 儿媳妇免费播放全部电视剧| 《疯狂伴娘》在线观看| 免费B站在线观看人数在哪儿找到| 高压监狱| 八戒八戒电影在线看免费观看8| 爱爱内含光| 《喂奶人妻厨房HD》| 妈妈的朋友3| 《不再是朋友的夜晚第二季》 | 《丰满的女邻居》播放| 妈妈可以帮儿子解决心理需要| 成品免费PPT网站入口| 电影初尝云雨之欢免费观看| 天美麻花星空高清免费观看完整版.. | DK| 3DMAX视频成品免费入口| B大与小哪个好| 细川麻里| 成熟5| 美女和老板一起努力做豆浆| 速度与激情10| 可爱多少钱一斤| 国产成人AV无码-二三区| 9.1免费漫画网站NBA| 电影免费观看高清完整版在线观看 | 《偷窥洗澡》在线观看| 妈妈叫我戴上避孕套英文| 9.1国产NBA免费看电影| 我在公车被蹭水后当晚就来了月经 | 公翁挺进苏玥的小沉视频| 蜜糖在线观看免费高清电视剧 | 1-46集电视剧免费观看 | 杨思敏电影| 15岁的少女与狗高清电视| 女性扒开大腿内侧小肚子痒| 《温柔善良的儿媳妇》的背景故事| 美国禁忌:性炮交| 狗配人的大片| 《办公室高潮秘书2》电影影| 二人努力生猴子免费观看