美文网首页
chapter15 上下文管理器和else块

chapter15 上下文管理器和else块

作者: F4A3 | 来源:发表于2017-12-01 10:58 被阅读0次

    主要讨论:

    • with 语句和上下文管理器
    • for、while 和try语句的else子句

    if语句之外的else块

    else子句不仅能够在if语句中使用,还能在for, while, try语句中使用.

    • for: 仅当for循环运行完毕时才执行else块.
    • while: 仅当while循环因为条件为假值而退出时才运行else块.
    • try: 仅当try块中没有异常抛出时才运行else块.

    上下文管理器和with块

    上下文管理器协议包含__enter____exit__两个方法.
    with语句在开始运行时,会在上下文管理器对象上调用__enter__方法,结束后会调用__exit__方法. 用__exit__方法扮演finally子句的角色.

    contextlib模块中的实用工具

    • closing:如果对象提供了close()方法,但没有实现__enter__/__exit__协议。可以使用这个函数构造上下文管理器。
    • suppress:构建临时忽略指定异常的上下文管理器
    • @contextmanager: 这个装饰器把简单的生成器函数变成了上下文管理器,这样就不用创建类去实现管理器协议了。
    • ContextDecorator: 基类,用于定义基于类的上下文管理器。
    • ExitStack:这个上下文管理器能够进入多个上下文管理器。with块结束时,ExitStack按照后进先出的顺序调用栈中各个上下文管理器的__exit__方法。

    使用@contextmanager

    在使用该装饰器的生成器中,yield语句的作用是把函数的定义体分为两部分: yield语句前面的所有代码在with块开始时执行(__enter__方法),yield后面的代码在with块结束时运行(__exit__方法).

    相关文章

      网友评论

          本文标题:chapter15 上下文管理器和else块

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