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

时间:2016-12-22 08:31:10

标签: python pycharm with-statement contextmanager

PyCharm警告此代码,说最后一次返回无法访问:

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

如果open()失败,我希望第二次返回会执行。谁是对的?

1 个答案:

答案 0 :(得分:11)

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

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