2016-02-11 92 views
4

,比如我有這段代碼:有沒有什麼辦法可以在Python函數中的每個return語句之前執行語句?

def example(): 
    a = 'goodbye' 
    if True: 
     print a 
     return 1 
    else: 
     print a 
     return 0 

我想知道是否有任何可能的解決方案寫一次「打印一個」,每個「返回」語句之前執行它automaticaly。因此,如果我添加更多的返回語句,我不需要添加任何內容,但是會執行「打印」。結果看起來像這樣:

def example(): 
    a = "goodbye" 
    """ some code to implement print a """ 
    if True: 
     return 1 
    else: 
     return 0 

每次有return語句它仍然會打印一個。

我試圖谷歌,但不知道如何查詢單詞,因爲所有的結果都是關於返回多個值。

UPDATE:我的問題得到解答,謝謝大家。
雖然包裝功能是正確的答案,但我選擇了回答GingerPlusPlus誰建議使用try...finally爲簡單起見。

+0

難道你不能重寫它只有一個返回語句嗎? – StoryTeller

+2

'在if和else'循環之前'打印''? – The6thSense

+0

只需在方法內使用'print'。一旦你執行'method',你將得到'print'語句的輸出。 –

回答

3

try .. finally期待:

def example(): 
    try: 
     if True: 
      return 1 
     else: 
      return 0 
    finally: 
     print 'goodbye' 

>>> example() 
goodbye 
1 

一個最後條款離開try語句之前一直執行,是否發生了異常或沒有。 Docs

+0

一個警告;根據你的例子,'finally:'子句在'try:'子句之前執行。在打印字符串的情況下,這可能是不相關的,但如果順序對於更復雜的功能來說很重要,請謹慎行事。 – pshep123

+0

@ pshep123:[Not really](http://rextester.com/WBUF54319)。 'finally'中的代碼在'try'後面運行,只是函數返回後纔打印返回值。 – GingerPlusPlus

+0

有趣,感謝您的澄清。 – pshep123

3

代碼:

def example(): 
    a = 'goodbye' 
    print a 
    if True: 
     return 1 
    else: 
     return 0 

如果print aif else那麼它會在您每次調用該函數時打印值。

+0

嘗試添加更多的細節,然後只是代碼。那麼你會得到更多的讚揚。 – The6thSense

+1

我會記住這一點。謝謝。 – PradeepK

2

創建一個價值returnval

returnval = 0 #default value 
testval = 0 # Code to set up if 
# code to set various values of testval 
if testval == 0: 
    returnval = 1 
elif testval == 5: 
    returnval = 2 
else: 
    returnval = 10 

print a 
return returnval 
6

可以使用的上下文。用您想要打印的值初始化它。然後在上下文退出時打印,即返回時打印。

class PrinterOnContextExit(): 
    def __init__(self, a): self.a = a 
    def __enter__(self): pass 
    def __exit__(self, exc_type, exc_value, traceback): print(self.a) 

def example(): 
    a = 'goodbye' 
    with PrinterOnContextExit(a): 
     if True: 
      return 1 
     else: 
      return 0 

請注意,您無法以此方式打印返回的值。如果你想打印返回的值,那麼你應該使用裝飾器。

class PrintOnReturn(): 
    def __init__(self, a): self.a = a 
    def __call__(self, func): return lambda *args, **kwargs: self.callFunc(func, *args, **kwargs) 
    def callFunc(self, func, *args, **kwargs): r = func(*args, **kwargs); print(self.a, r); return r 

@PrintOnReturn("hello") 
def example(): 
    if True: 
     return 1 
    else: 
     return 0 

這將打印您傳遞給裝飾器的任何字符串,接着是從裝飾函數返回的值。這裏hello 1

+0

這是從功能 – AlokThakur

+0

@ didier-trosset回覆時打印一些東西的最佳方式,謝謝您的回答!我會添加斷行以使代碼更具可讀性。 – Dmitry

1
Def example(): 
a = 'goodbye' 
if True: 
return 1,str(a) 
    else: 
    return 0,str(a) 
print example() 

多數民衆贊成在唯一的辦法......我不認爲有一種方法來避免打印你想打印什麼......對不起隊友!如果你輸入一個函數類型的認爲你

+0

鍵入你想要執行的事情,並在你的示例函數中調用它......無論如何,祝你好運! –

2

你也可以使用一個裝飾,它是否適合你的情況:

>>> def decorator(text): 
...  def wrapped(func): 
...   def inner(*args, **kwargs): 
...    result = func(*args, **kwargs) 
...    print text 
...    return result 
...   return inner 
...  return wrapped 
... 

>>> @decorator('goodbye') 
... def example(): 
...  return True 
... 

>>> example() 
goodbye 
>>> True 

裝飾將允許您打印任何文字裝飾函數被調用後。或之前。

相關問題