【问题标题】:Try-Finally: Get current returning valueTry-Finally:获取当前返回值
【发布时间】:2018-01-14 23:33:35
【问题描述】:

我在看this list of python quirks,很高兴这会返回False

def t():
    try:
        return True
    finally:
        return False

看到这个后,我看到了herehere的答案,它们给出了原因,那就是finally子句将永远被执行,没有例外。

我的问题是,之前的return 值存储在哪里:

def t():
    try:
        return True
    finally:
        ...

为什么这不返回None,而是返回原来的True

是否可以通过编程方式访问要返回的值?

def t():
    try:
        return True
    finally:
        ...
        # if returning != None: return False

我想知道是否可以在不使用变量的情况下执行此操作,例如:

def t():
    retval = None
    try:
        retval = "Set"
    finally:
        if retval != None:
            return retval
        else:
            return "Not Set"

def t():
    retval = None
    try:
        ...
    finally:
        if retval != None:
            return retval
        else:
            return "Not Set"

分别返回'Set''Not Set'

【问题讨论】:

  • 显然它存储在 somewhere 所以它可以在finally: 子句之后使用(假设它不包含return 语句),但这是一个实现细节。

标签: python return try-catch


【解决方案1】:

为什么这不返回None,而是返回原来的True

来自docs

当 try 语句的任何其他子句通过 breakcontinuereturn 语句离开时,finally 子句也会在“退出时”执行。

所以这意味着如果finally 子句中存在return 语句,则该值将被返回(因为finally 块保证完全执行,所以其中的任何return 语句都将被执行为好吧)。否则,如果 try/except 块要返回一个值,则返回该值。

这意味着

def t():
    try:
        print("Inside try")
        return "Return from try"
    finally:
        print("Inside finally")
        return "Return from finally"

将完全按照以下方式执行:

def t():
    try:
        print("Inside try")
        # start of old finally block, executed "on the way out"
        print("Inside finally")
        return "Return from finally"
        # end of old finally block, inserted right before return statement in try
        return "Return from try"
    finally:
        pass

是否可以通过编程方式访问将要返回的值?

不,如果不保存,您无法访问代码其他部分中return 语句之后的值。

【讨论】:

  • “不,你不能访问代码其他部分的return语句之后的值而不保存它。”你有证据支持吗,而且我知道finally 子句也被执行,但是该引用并没有解释为什么返回try/except 值而不是如果finally 没有返回,我知道它做到了,问题是为什么。在回答为什么方面,python 字节码的演练会很有用。
  • 因为正如@martineau 所说,这是一个实现细节。对于另一个问题,假设finally 块内的所有代码恰好放在任何返回值/引发异常(如果存在)的语句之前。如果finally 不返回任何内容或不引发异常,程序将继续运行。我认为docs(在您提供的 SO 帖子之一中链接)对此进行了很好的解释。
猜你喜欢
  • 2018-11-05
  • 2021-05-30
  • 2014-04-27
  • 1970-01-01
  • 2014-12-26
  • 2017-07-20
  • 2015-02-16
  • 2016-03-28
  • 2013-06-28
相关资源
最近更新 更多