Распакуйте и назначьте одно возвращаемое значение из функции множественного возврата в одной строке (Python).

#python

Вопрос:

Я пытаюсь сделать следующее, но это не работает:

 agreements = getEligibleAndActiveAgreements(username).eligibleAgreements
 

для функции, которая возвращает 2 результата. Я не хочу сначала назначать общую переменную, например result = .. , а затем проверять result.eligibleAgreements , я хочу быстро назначить в той же строке конкретную переменную только с одного возврата.

 def getEligibleAndActiveAgreements(username):
    ...
    return eligibleAgreements, activeAgreements
 

Ошибка для getEligibleAndActiveAgreements(имя пользователя).Приемлемые условия

 AttributeError: 'tuple' object has no attribute 'eligibleAgreements' 
 

Ошибка для getEligibleAndActiveAgreements(имя пользователя)[«Допустимые элементы»]

 TypeError: tuple indices must be integers or slices, not str
 

Ответ №1:

Попробуйте любой из этих:

 agreements, _ = getEligibleAndActiveAgreements(username)
# OR
agreements = getEligibleAndActiveAgreements(username)[0]
 

Функция возвращает кортеж, содержащий оба значения. Чтобы получить независимый доступ к значениям, вам необходимо использовать значения индекса (начиная с 0) или просто распаковать их в один и отказаться от другого.

Ответ №2:

Ссылки на возвращаемые переменные известны только локально внутри функции, когда вы вызываете функцию, она не знает ссылок из return x,y строки, это просто кортеж вне функции.

Так что вы можете сделать:

 eligibleA, activeA = getEligibleAndActiveAgreements(username)
 

Или, в качестве альтернативы, просто вернитесь dict :

 def getEligibleAndActiveAgreements(username):
    ...
    return {"eligibleAgreements": eligibleAgreements, "activeAgreements": activeAgreements}
...
agreements = getEligibleAndActiveAgreements(username)

eligibleAgreements = agreements["eligibleAgreements"]
 

Комментарии:

1. Чтобы добавить, dict(eligibleAgreements=eligibleAgreements, activeAgreements=activeAgreements) есть альтернативный синтаксис.