Python `with` 语句语义等价

Acmeist0815

我很困惑为什么在 Python docs 8.5hit_except的以下代码中是必要的。with 声明

以下代码:

with EXPRESSION as TARGET:
    SUITE

在语义上等价于:

manager = (EXPRESSION)
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager)
hit_except = False

try:
    TARGET = value
    SUITE
except:
    hit_except = True
    if not exit(manager, *sys.exc_info()):
        raise
finally:
    if not hit_except:
        exit(manager, None, None, None)

是不是像这样写得更简单,还是我缺少区别?

manager = (EXPRESSION)
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager)

try:
    TARGET = value
    SUITE
except:
    if not exit(manager, *sys.exc_info()):
        raise
else:
    exit(manager, None, None, None)
错误

finally保护任何“退出”当前try范围的操作。

如果存在跳过其余代码的操作,例如returnandexit()continue/ break(在循环中),else则将跳过该部分。在所有这些情况下,该finally子句仍将触发。

强制跳过上下文管理器finally__exit__上下文管理器部分的一个示例是os._exit(),在大多数情况下,这可能是一种矫枉过正的做法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章