2012-07-30 54 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

通过改变返回值的类型您正在更改此函数与调用它的任何代码之间的“合同”。所以你可能应该改变调用它的代码。

但是,您可以添加一个可选参数,该参数在设置时将返回新类型。这样的改变会保留旧的合同,并允许你有一个新的合同。尽管有不同种类的返回类型,这很奇怪。此时,完全创建一个新函数或修复调用代码可能会更清洁。