最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • python上下文是什么

    正文概述    2020-01-12   321

    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

    二、上下文管理器类型

    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平台,欢迎关注!


    下载网 » python上下文是什么

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元