2017-08-07 43 views
1

我看着this list of python quirks,被逗乐了,这个返回False尝试,最后:获取当前返回值

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

看到这,我看到它提出的理由答案herehere后,就是这样子句总是会被执行,没有例外。

我的问题是,在那里保存的上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

很明显,它存储在_somewhere_中,所以它可以在'finally:'子句之后使用(假设不包含'return'语句),但这是一个实现细节。 – martineau

回答

3

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

docs

finally条款也被“的出路”的时候,try语句的任何其他条款通过breakcontinuereturn声明左执行。

因此,这意味着,如果一个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语句后的值而不保存它。

+0

*“不,你不能在代码的其他部分访问return语句之后的值而不保存它。”*您是否有证据支持这一点,并且我知道'finally'子句是也执行了,但是这个引用并没有解释为什么'try/except'的值会返回,如果'finally'没有返回,我意识到它会这样做,问题是为什么。在回答*为什么* python字节码的演练会很有用。 –

+1

因为@martineau说,这是一个实现细节。对于另外一个问题,想象'finally'块中的所有代码恰好在任何返回值/返回异常(如果存在)的语句之前放*。如果'finally'什么也不返回或者不会引发异常,程序会继续。我认为这在[docs](https://docs.python.org/3/reference/compound_stmts.html#the-try-statement)中得到了很好的解释(它们在您提供的SO帖子之一中链接) 。 – EsotericVoid

+0

回复:关于在异常/返回之前将代码置于finally块中的说法,您可以将它放入您的答案中,这完全解释了我的问题 –

相关问题