Python 是`带回来的。。返回`无法访问的代码?

Python 是`带回来的。。返回`无法访问的代码?,python,pycharm,with-statement,contextmanager,Python,Pycharm,With Statement,Contextmanager,PyCharm警告此代码,表示无法访问最后一次返回: def foo(): with open(...): return 1 return 0 如果open()失败,我希望第二次返回将执行。谁是对的?皮查姆是对的。如果open() with不会以某种方式保护您免受生成上下文管理器的表达式中出现异常的影响。使用的之后的表达式预计会生成一个上下文管理器,此时存储它的\uuuuuuu退出方法,并调用它的\uuuuuuu进入方法。这里唯一的结果是成功生成并输入上下文管理

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

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

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

皮查姆是对的。如果
open()


with
不会以某种方式保护您免受生成上下文管理器的表达式中出现异常的影响。使用
之后的表达式预计会生成一个上下文管理器,此时存储它的
\uuuuuuu退出
方法,并调用它的
\uuuuuuu进入
方法。这里唯一的结果是成功生成并输入上下文管理器,或者引发异常。在这个阶段,
with
在任何时候都不会吞下一个异常,然后默默地跳过该块。

所有上下文管理器都是这样吗?如果您编写一个自定义的函数来接受异常(在本例中替换为open),它将到达第二个返回,不是吗?(在我修改的一些代码中遇到了这个问题,也被linter的指示弄糊涂了。)@NathanielFord:所有产生上下文管理器的表达式都是这样
open()
是一个函数调用,调用的结果是一个上下文管理器。该调用可能会产生异常,而不是返回某些内容。这就是问题所在;在创建上下文管理器之前,异常仍然可能发生。@NathanielFord:因此,如果您将
open()
替换为始终返回上下文管理器且从不引发异常的内容,则可以强制执行该问题。但是如果你的替代者仍然打开一个文件对象,你仍然需要在那个阶段处理异常。明白了!谢谢