(以下是我第一次分析with
语句, 个人感觉理解不深)
关于with语句: with
语句在Python2.5开始引入使用(可以理解成, 此时与异常处理一起使用(try..catch..finally
)), 但with语句适用于对资源进行访问的场合(如文件使用后自动关闭, 线程中锁的自动获取和释放), 确保不管使用过程中是否发生异常, 都执行必要的清理操作(以释放资源, 如上述的文件, 锁等). (注: 区别普通的计算工作(如只占用CPU和内存)和资源访问的工作这两类程序任务, 从这个角度去分析与理解with的实在意义, 参考: IBM社区[Ref])
上下文管理协议(Context Management Protocol) | 上下文管理器(Context Manager) |
---|---|
包含方法__enter()__ 和 __exit()__ , 支持该协议的类/对象要实现这两个方法. |
实现了__enter()__ 和__exit()__ 方法的类, 也就支持了上下文管理协议. |
注: 上述两个方法是PYTHON内置方法, 理解成默认就是上下文协议的实现, 那么, "采用"这两个方法的其它对象, 就是支持上下文协议的了. | 注: 在PYTHON中, 通常使用with 语句调用上下文管理器, 不过也可以通过直接调用其方法来使用. |
其它术语/概念 | 解释/说明 |
---|---|
运行时上下文(Runtime Context) | 由上下文管理器创建, 通过上下文管理器的 __enter()__ 和__exit()__ 方法实现, __enter()__ 方法在语句体执行之前进入运行时上下文, __exit()__ 在语句体执行完后从运行时上下文退出, with 语句支持运行时上下文这一概念. (注: 什么狗屁解释, 语文的辞藻上下文一定要生搬硬套到计算机中: 把context 理解成一段"有进(__enter()__ )有出(__exit()__ )要控制的代码块") |
上下文表达式(Context Expression) | with 语句中跟在关键字with 之后的表达式, 该表达式要返回一个上下文管理器对象, 如: with context_expression [as target(s)]: ... , 至于怎么返回: 要么自定义好上下文管理器对象, 要么调用原有PYTHON中的上下文管理器对象. |
语句体(with-body ) |
with 语句包裹起来的代码块, 在执行语句体之前会调用上下文管理器(对象)的__enter()__ 方法, 执行完语句体之后会执行__exit()__ 方法. (注: 这里, 我估计PYTHON解释器做了手脚, 它在解析PYTHON语句时自动(隐式地)把__enter()__ 语句和__exit()__ 语句安插在了with 语句块的前后两端, 没错了没跑了, 就这样了) |
具体地, 还是看看PEP-343(The “with” Statement)[Ref]中怎么说的好了, 然后根据自己的理解去理解(Specification: The ‘with’ Statement 小节[Ref]):
A new statement(指with
语句) is proposed with the syntax:
with EXPR as VAR:
BLOCK
Here, ‘with’ and ‘as’ are new keywords; EXPR
is an arbitrary expression (but not an expression-list) and VAR
is a single assignment target. It can not be a comma-separated sequence of variables, but it can be a parenthesized comma-separated sequence of variables. (This restriction makes a future extension possible of the syntax to have multiple comma-separated resources, each with its own optional as-clause) The “as VAR” part is optional. The translation of the above statement is:
mgr = (EXPR)
exit = type(mgr).__exit__ # Not calling it yet
value = type(mgr).__enter__(mgr)
exc = True
try:
try:
VAR = value # Only if "as VAR" is present
BLOCK
except:
# The exceptional case is handled here
exc = False
if not exit(mgr, *sys.exc_info()):
raise
# The exception is swallowed if exit() returns true
finally:
# The normal and non-local-goto cases are handled here
if exc:
exit(mgr, None, None, None)
好了, 以上部分是截取自PEP-343网页的内容, 个人觉得是with
语句的核心释义, 就当做是"with
语句就是拿来当做try..catch..finally
来使用的"这个说法的解释说明.
=====第一次与第二次分析的分割线=====
(以下是我第二次分析with
语句)
(上面的分析只好截图贴于此了) 直接把with
代码块理解成两个步骤: 1.Python解释器把tf.Session()
(隐式)返回给with
语句的对象的里俩方法(__enter__()
和__exit__()
)插入到这个语句块的前后, 2.在执行完__enter__()
方法后, Python将该方法返回的变量’赋值’给sess
(即, as sess
子语句), 然后执行流开始执行with
语句块内的语句.
“Read The Fxxking Source Code(RTFSC)”, or “The Doc”(我加的).
TODO.