Python with 语句分析

(以下是我第一次分析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语句)
Python with 语句分析_第1张图片
(上面的分析只好截图贴于此了) 直接把with代码块理解成两个步骤: 1.Python解释器把tf.Session()(隐式)返回给with语句的对象的里俩方法(__enter__()__exit__())插入到这个语句块的前后, 2.在执行完__enter__()方法后, Python将该方法返回的变量’赋值’给sess(即, as sess子语句), 然后执行流开始执行with语句块内的语句.

总结

“Read The Fxxking Source Code(RTFSC)”, or “The Doc”(我加的).


Reference

TODO.

你可能感兴趣的:(PL)