残念ながら、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()