美文网首页
with 与 上下文管理器

with 与 上下文管理器

作者: 好小葱1 | 来源:发表于2018-08-06 16:19 被阅读6次
    with file
    等价于

    它的执行流程如下:

    1. 首先执行open('output', 'w'),返回一个文件对象
    2. 调用这个文件对象的__enter__方法,并将__enter__方法的返回值赋值给变量f
    3. 执行with语句体,即with语句包裹起来的代码块
    4. 不管执行过程中是否发生了异常,执行文件对象的__exit__方法,在__exit__方法中关闭文件。

    一个实现了__enter____exit__方法的对象就称之为上下文管理器

    上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。__enter__方法在语句体执行之前进入运行时上下文,__exit__在语句体执行完后从运行时上下文退出。

    在实际应用中,__enter__一般用于资源分配,如打开文件、连接数据库、获取线程锁;__exit__一般用于资源释放,如关闭文件、关闭数据库连接、释放线程锁。

    __enter__() - 进入上下文管理器的运行时上下文,在语句体执行前调用。如果有as子句,with语句将该方法的返回值赋值给 as 子句中的 target。

    __exit__(exception_type, exception_value, traceback) - 退出与上下文管理器相关的运行时上下文,返回一个布尔值表示是否对发生的异常进行处理。如果with语句体中没有异常发生,则__exit__的3个参数都为None,即调用 __exit__(None, None, None),并且__exit__的返回值直接被忽略。如果有发生异常,则使用 sys.exc_info 得到的异常信息为参数调用__exit__(exception_type, exception_value, traceback)。出现异常时,如果__exit__(exception_type, exception_value, traceback)返回 False,则会重新抛出异常,让with之外的语句逻辑来处理异常;如果返回True,则忽略异常,不再对异常进行处理。

    上下文管理器
    输出

    我们也可以使用contextlib库来自定义上下文管理器

    contextlib + 生成器(yield)

    相关文章

      网友评论

          本文标题:with 与 上下文管理器

          本文链接:https://www.haomeiwen.com/subject/ovjgvftx.html