К сожалению, 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()