2012-07-30 73 views
5

我想更改一個python函數以返回兩個值。我如何在不影響任何以前僅僅期望返回值的函數調用的情況下實現該功能?Python中的多個返回值

例如,

原始定義:

def foo(): 
    x = 2 
    y = 2 
    return (x+y) 

總和= FOO()

氖定義:

def foo(): 
    x = 2 
    y = 2 
    return (x+y), (x-y) 

總和,DIFF = FOO()

我想這樣做前一次調用foo的方式也是有效的嗎? 這可能嗎?

回答

12
def foo(return_2nd=False): 

    x = 2 
    y = 2 
    return (x+y) if not return_2nd else (x+y),(x-y) 

添加參數,然後調用新的版本

sum, diff = foo(True) 
sum = foo() #old calls still just get sum 
+1

尼斯破解。如果你想在這裏使用所有的Java,你能不能改變它來返回一個自定義類,它的行爲像一個int(通常是第一個值),但也可以像元組一樣索引?那麼你甚至不需要改變呼叫簽名。 – 2012-07-30 17:49:30

+0

你可以但那會是更多的工作,我認爲...這是最簡單的方法(在我看來)完成OP想要的... – 2012-07-30 17:50:47

+0

順便說一句,你是有名的[大衛比斯利](http: //www.dabeaz.com/)? – 2012-07-30 17:50:58

0

我很遺憾地告訴你,但函數重載在Python中無效。因爲Python不會執行類型強制執行,所以foo的多個定義會導致使用最後一個有效的。一個常見的解決方案是定義多種功能,或在功能作爲一個標誌(你需要實現自己)

2

通過改變返回值的類型您正在更改此函數與調用它的任何代碼之間的「合同」。所以你可能應該改變調用它的代碼。

但是,您可以添加一個可選參數,該參數在設置時將返回新類型。這樣的改變會保留舊的合同,並允許你有一個新的合同。儘管有不同種類的返回類型,這很奇怪。此時,完全創建一個新函數或修復調用代碼可能會更清潔。