• with as 用法


    with从Python 2.5就有,需要from __future__ import with_statement。
    自python 2.6开始,成为默认关键字。
    在What's new in python2.6/3.0中,明确提到:
    The ‘with‘ statement is a control-flow structure whose basic
    structure is:
    with expression [as variable]:
    with-block
    也就是说with是一个控制流语句,跟if/for/while/try之类的是一类的,with可以用来简化try finally代码,看起来可以比try finally更清晰。
    这里新引入了一个"上下文管理协议"context management protocol,实现方法是为一个类定义__enter__和__exit__两个函数。
    with expresion as variable的执行过程是,首先执行__enter__函数,它的返回值会赋给as后面的variable,想让它返回什么就返回什么,只要你知道怎么处理就可以了,如果不写as variable,返回值会被忽略。
    然后,开始执行with-block中的语句,不论成功失败(比如发生异常、错误,设置sys.exit()),在with-block执行完成后,会执行__exit__函数。
    这样的过程其实等价于:
    try:
    执行 __enter__的内容
    执行 with_block.
    finally:
    执行 __exit__内容
    只不过,现在把一部分代码封装成了__enter__函数,清理代码封装成__exit__函数。
    我们可以自己实现一个例子:

    # -*- encoding: utf-8 -*-
    import sys
    
    
    class test:
        def __enter__(self):
            print "enter"
            return 1
    
        def __exit__(self, *args):
            print "exit"
            return True
    
    with test() as t:
        print("t is not the result of test(), it is __enter__ returned")
        print("t is 1, yes, it is {0}".format(t))
        raise NameError("Hi there")
        sys.exit()
        print("Never here")

    执行结果如下:

    enter
    t is not the result of test(), it is __enter__ returned
    t is 1, yes, it is 1
    exit

    注意:
    1,t不是test()的值,test()返回的是"context manager object",是给with用的。t获得的是__enter__函数的返回值,这是with拿到test()的对象执行之后的结果。t的值是1.
    2,__exit__函数的返回值用来指示with-block部分发生的异常是否要re-raise,如果返回False,则会re-raise with-block的异常,如果返回True,则就像什么都没发生。

  • 相关阅读:
    Java的参数传递是值传递还是引用传递
    10张图带你深入理解Docker容器和镜像
    Java 如何有效地避免OOM:善于利用软引用和弱引用
    事务与一致性:刚性or柔性
    Java 面试题史上最强整理
    三张图秒懂Redis集群设计原理
    iOS开发笔记系列-基础4(变量与数据类型)
    iOS开发笔记系列-基础3(多态、动态类型和动态绑定)
    iOS开发笔记系列-基础2(类)
    iOS开发笔记系列-基础1(数据类型与表达式)
  • 原文地址:https://www.cnblogs.com/forilen/p/4451076.html
Copyright © 2020-2023  润新知