一段基本的 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')
- 如果后续用到 EXPR 的返回值,则后要跟 as 以将其返回值保存下来
执行
BLOCK
中的表达式。- 调用上下文管理器的
__exit()__
方法。如果 BLOCK 的执行过程中发生了一个异常导致程序退出,那么异常的 type 、 value 和 traceback (即 sys.exc_info()的返回值 )将作为参数传递给__exit()__
方法。否则,将传递三个 None 。