`with return .. return` 是无法访问的代码吗?

Is `with return .. return` unreachable code?

PyCharm 警告此代码,说最后一个 return 无法访问:

def foo():
    with open(...):
        return 1
    return 0

我预计第二个 return 会在 open() 失败时执行。谁是对的?

PyCharm 是对的。如果 open() 失败,则引发异常,并且 两者都未达到 return

with 不会以某种方式保护您免受生成上下文管理器的表达式中的异常的影响。 with 之后的表达式预计会产生一个上下文管理器,此时它的 __exit__ 方法被存储并调用它的 __enter__ 方法。这里唯一的结果是成功生成并输入上下文管理器,或者引发异常。 with 绝不会在此阶段吞下异常并静静地跳过该块。