繁体   English   中英

Python函数中返回值的数量不同

[英]Different number of return values in Python function

从Python中的函数返回不同数量的返回值是否可以/良好实践? 如果是,调用者应如何处理返回值? 例如

def func():
    if(condition_1):
        return 1,2
    if(condition_2):
        return 1
    if(condition_3):
        return 1,2,3,4

注意: condition_1,condition_2和condition_3是函数func的本地函数,因此调用者不知道将返回多少个值。

可以返回多个值,但是您必须以相同的形式/类型保留所有返回值以便使用:

def func():
    if(condition_1):
        return 1, 2
    if(condition_2):
        return 1,    # return a tuple same as the others
    if(condition_3):
        return 1, 2, 3, 4

函数返回多个值是pythonic吗? 对此有一个很好的解释。

但在您的情况下,这取决于您的用例。 如果您知道如何处理返回数据,那么使用它就没有问题。 喜欢:

def func():
    if(condition_1):
        return a,b
    if(condition_2):
        return (a, )
    if(condition_3):
        return c,d,e,f
    if(condition_4):
        return a,b

vals = func()
if len(vals) == 2:
    # We are sure that we will get `a,b` in return
    do something ...
elif len(vals) == 3:
    ...

在上面的示例中,将处理vals元组的函数知道如何根据某些条件处理返回数据。 它有2种return可能性,返回相同的数据!

如果您确切知道如何处理数据,那么可以使用不同数量的返回。 这里的关键点是函数完成一项工作 如果您在识别返回值时遇到问题,那么您的函数正在执行多个作业,或者您必须避免使用不同数量的参数。

虽然这是主观的,但我喜欢返回词典 - 它有助于避免关注返回的顺序,我可以有部分返回(例如5个中的3个元素)并且它使代码更具可读性。

def func():
    if(condition_1):
        return {'name': 'Joe', 'age': 32}
    if(condition_2):
        return {'name': 'Mary'}

res = func()
name = res.get('name', 'unknown')
age = res.get('age', 0)

我会避免这种情况。 一般情况下(尽管偶尔有例外),正如其他人所提到的,从函数的每个分支返回相同类型的对象是个好主意。 然而,这比仅仅在单元素元组中包装单个返回值更深入 - 考虑一种模式,您返回相同数量的事物(以相同的顺序),并使用None或某些特定于类型的'null'值( Null)任何不适用于该分支的对象模式 )。

这意味着客户端代码总是可以这样做:

a, b, c, d, e = func()

并忽略它不关心的任何值。 对于混合中的空对象模式,即使是关注可能不存在的值的代码也可能不需要特殊情况。 如果改变元组的长度,则必须为任何分支的结果准备每个调用,这意味着它几乎必须匹配您的分支。

对于您和调用代码来说,强制执行此类模式的一种非常好的方法是使用collections.namedtuple 这也有很好的好处,使您的代码立即更自我记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM