一段基本的 with 表达式,其结构是这样的:

with EXPR as VAR:
  BLOCK

EXPR 可以是任意表达式; as VAR 是可选的。其一般的执行过程是这样的:

  • 计算 EXPR ,并获取一个上下文管理器。
  • 上下文管理器(上下文管理器,实现了 __exit__/__enter()__/__exit()__方法的类的实例化对象)的__exit()__方法被保存起来用于之后的调用。
  • 调用上下文管理器的__enter()__方法。
  • 如果 with 表达式包含 as VAR ,那么 EXPR 的返回值被赋值给 VAR

    • 如果后续用到 EXPR 的返回值,则后要跟 as 以将其返回值保存下来
      • with open() as f:
    • 如果后续用不到 EXPR 的返回值,仅仅提供一个运行的上下文环境,则后不必跟 as:
    graph = tf.Graph()
    with graph.as_default():
        x = tf.Variable(5, name='x')
  • 执行 BLOCK 中的表达式。

  • 调用上下文管理器的 __exit()__方法。如果 BLOCK 的执行过程中发生了一个异常导致程序退出,那么异常的 type 、 value 和 traceback (即 sys.exc_info()的返回值 )将作为参数传递给__exit()__方法。否则,将传递三个 None 。

references

posted on 2018-01-14 19:01  未雨愁眸  阅读(234)  评论(0编辑  收藏  举报