Try-Finally:获取当前返回值

时间:2017-08-07 15:32:06

标签: python return try-catch

我正在查看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'

1 个答案:

答案 0 :(得分:3)

  

为什么不返回None而是返回原始True

来自docs

  

当通过finallybreakcontinue语句留下try语句的任何其他子句时,return子句也会在“出路”上执行。

所以这意味着如果return子句中存在finally语句将返回该值(因为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语句之后的值而不保存它。