【问题标题】:Is `with return .. return` unreachable code?`with return .. return` 是无法访问的代码吗?
【发布时间】:2016-12-22 08:31:09
【问题描述】:

PyCharm 对这段代码发出警告,说最后一个返回是不可达的:

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

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

【问题讨论】:

    标签: python pycharm with-statement contextmanager


    【解决方案1】:

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

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

    【讨论】:

    • 所有上下文管理器都是这样吗?如果您编写一个确实吞下异常的自定义项(在这种情况下替换 open ),它将达到第二次返回,不是吗? (在我正在修改的一些代码中遇到了这个问题,并且对 linter 的指示感到困惑。)
    • @NathanielFord:所有产生上下文管理器的表达式都是如此。 open() 是一个函数调用,调用的结果是一个上下文管理器。该调用可能会产生异常而不是返回某些内容。这就是这里的问题;在创建上下文管理器之前,仍然可能发生异常。
    • @NathanielFord:因此,如果您将open() 替换为总是 返回上下文管理器且从不引发异常的东西,那么您可以强制解决问题。但是如果你的替换仍然打开一个文件对象,你仍然需要在那个阶段处理异常。
    • 知道了!谢谢。
    猜你喜欢
    • 2022-11-01
    • 2021-02-28
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多