2017-08-07 41 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塊中的說法,您可以將它放入您的答案中,這完全解釋了我的問題 –

相關問題