从长度为1的元组解包返回值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从长度为1的元组解包返回值相关的知识,希望对你有一定的参考价值。

假设我有一个虚函数,它可以返回确切的参数:

def dummy_single(arg1):
    """Repeat the same argument."""
    return arg1

我可以通过以下方式使用此功能:

same_obj1 = dummy_single(obj1)

现在,如果我想允许此函数接受多个参数,并返回相同的参数,我可以打包并解压缩参数:

def dummy_multiple(*args):
    """Repeat all given arguments."""
    return args

请注意,此功能恰好是身份,但这不是问题的核心。你可以想象任何函数返回一个可变长度的元组。

使用多个参数调用它时效果很好:

same_obj1, same_obj2 = dummy_multiple(obj1, obj2)

但是,这不会按预期工作:

same_tuple = dummy_multiple(obj1)

same_obj1包含一个(打包的)元组,而不是前两个示例中的对象。我考虑过以下方式修复此行为,但它看起来并不干净,因为返回的类型因参数而异。

def dummy_multiple_fixed(*args):
    """Repeat all given arguments."""
    if len(args) == 1:
        return args[0]
    return args

这不是一个关键问题,很容易修复。但我找不到一个干净而优雅的方法来解决这个问题。

答案

你不应该在长度为1的元组中做出特殊情况。函数应该有一个明确定义的返回类型。

虽然,知道你可以解压缩长度为1的元组:

def dummy_multiple(*args):
    """Repeat all given arguments."""
    return args

same_obj1, = dummy_multiple(1)
#        ^ notice the comma here

print(same_obj1) # 1

以上是关于从长度为1的元组解包返回值的主要内容,如果未能解决你的问题,请参考以下文章

scala 将元组解包到案例类参数和附加的 zip 两个序列中

Python入门教程第58篇 函数进阶之元组解包

返回语句中的 Python 元组解包

Python3 元组解包情况总结

从 RDD 中的元组中解包项目时出现 Spark 错误

Pylint 警告:可能不平衡的元组与序列解包