Python中的多返回值

5
我可以帮您将一个 Python 函数改为返回两个值。如何在不影响以前只期望一个返回值的任何函数调用的情况下实现这一点?
例如:
原始定义:
def foo():
    x = 2
    y = 2
    return (x+y)

sum = foo()

Ne Definition:

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

sum,diff = foo()

我希望以一种方式完成这个操作,使得之前对foo的调用仍然有效?这可行吗?

3个回答

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 一样运作(通常是第一个值),但也可以像元组一样进行索引?然后你甚至不需要改变调用签名。 - Tyler Eaves
你可以这样做,但我认为那会更麻烦...这是最简单的方法(在我看来)来实现OP想要的东西... - Joran Beasley
@PauloScardine 没有,至少我不知道...虽然他有点像我。 - Joran Beasley
5
我强烈建议使用以下方式调用函数 foo: foo(return_2nd=True),而不是 foo(True),因为这种方式更加明确,增强了可读性,并且对于不知道该函数根据参数返回不同数量结果的其他程序员来说也很清晰。当然,_return_2nd_ 可以更改为更加明确的名称,比如 _return_diff_ 或类似的名称。 - krenel

2

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

但是,您可以添加一个可选参数,当设置时将返回新类型。这样的更改将保留旧合同并允许您拥有新的合同。尽管具有不同种类的返回类型很奇怪。在那个点上,最好创建一个全新的函数或修复调用代码。


0
很抱歉告诉你,但在Python中函数重载是无效的。因为Python不执行类型强制,foo的多个定义会导致使用最后一个有效的定义。一种常见的解决方案是定义多个函数,或在函数中添加一个参数作为标志(需要自己实现)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接