不幸的是,Python 使用 Pythonic “请求宽恕比请求许可更容易”的方法解包返回的元组。也就是说,如果你有一个声明:
a,b,c = f()
在幕后,它正在做一些事情:
try:
a = returned[0]
b = returned[1]
c = returned[2]
except IndexError:
raise ValueError('need more than k values to unpack')
try:
_ = returned[4]
except IndexError:
pass
else:
raise ValueError('too many values to unpack')
所以它动态地发现返回的值的数量。不幸的是,这使我们无法聪明并创建一种新的类型来处理变量返回:
class VariableReturn(object):
def __getitem__(self, index):
return ...
在 Python 3 中,您可以按照您的要求做一些事情,但负担在调用者身上,而不是被调用的函数。该函数应始终返回相同数量的结果,但我们将使用扩展元组解包捕获剩余的结果,如StackOverflow 问题所示。
使用这种方法,您可以返回任意数量的结果,但在最大情况下,您需要始终返回至少尽可能多的结果。其余的被打包成一个尾随元组。
a,*others = f()
a,b,*others = f()
a,b,c,*others = f()