Вы не можете вернуть два значения, но вы можете вернуть a tupleили a listи распаковать его после вызова:
def select_choice():
...
return i, card # or [i, card]
my_i, my_card = select_choice()
На линии return i, card i, cardозначает создание кортежа. Вы также можете использовать круглые скобки return (i, card), но кортежи создаются через запятую, поэтому парены не обязательны. Но вы можете использовать парены, чтобы сделать ваш код более читабельным или разбить кортеж на несколько строк. То же самое относится и к линии my_i, my_card = select_choice().
Если вы хотите вернуть более двух значений, рассмотрите возможность использования именованного кортежа . Это позволит вызывающей функции получить доступ к полям возвращаемого значения по имени, которое более читабельно. Вы по-прежнему можете получить доступ к элементам кортежа по индексу. Например, в Schema.loadsметоде Marshmallow Framework возвращает a, UnmarshalResultкоторый является a namedtuple. Так что вы можете сделать:
data, errors = MySchema.loads(request.json())
if errors:
...
или
result = MySchema.loads(request.json())
if result.errors:
...
else:
# use `result.data`
В других случаях вы можете вернуть dictиз вашей функции:
def select_choice():
...
return {'i': i, 'card': card, 'other_field': other_field, ...}
Но вы можете рассмотреть возможность возврата экземпляра служебного класса, который упаковывает ваши данные:
class ChoiceData():
def __init__(self, i, card, other_field, ...):
# you can put here some validation logic
self.i = i
self.card = card
self.other_field = other_field
...
def select_choice():
...
return ChoiceData(i, card, other_field, ...)
choice_data = select_choice()
print(choice_data.i, choice_data.card)