Python — возвращает несколько значений с помощью tuple (AWS лямбда-функция)

#python #amazon-web-services #lambda #aws-lambda #boto3

#python #amazon-веб-сервисы #лямбда #aws-lambda #boto3

Вопрос:

Это текущий код, который у меня есть:

 def handler():
    ec2 = boto3.resource("ec2", region_name="ap-southeast-2")
    instances = ec2.instances.filter(Filters=[{'Name':'iam-instance-profile.arn', 'Values': ['arn:aws:iam::123456789012:instance-profile/TestRole']}])
    for instance in instances:
        return (instance.private_ip_address)
  

Я пытаюсь вернуть все private_ip_addresses. Этот код возвращает мне только 1 ip-адрес, но я должен получать обратно 3 адреса. Если бы вместо этого я сделал print , он вернул бы правильные 3 значения

Я провел некоторое исследование и обнаружил, что использование tuple — хороший способ, но у меня пока что это не работает. Вот пример кода, который я пробую с tuple (который должен работать с моим кодом, если он правильный)

 myList=[1,2,3,4,5,6]

def handler():
   tup=()
   for element in myList:
       tup = (element,)
   return tup
  

В настоящее время это возвращает нулевое значение. Однако, если я это сделаю print tup , он возвращает мне (1, 2, 3, 4, 5, 6)

Кто-нибудь может сообщить мне, где я ошибаюсь в использовании tuple. ИЛИ если есть лучший способ сделать это (соответствующий тому, как работают лямбда-функции)?

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

1. Это плохая практика изменять tuple , list и set созданы для этой цели!

Ответ №1:

Оператор « return (instance.private_ip_address) » возвращает кортеж, состоящий из одного значения. Тот факт, что он вызывается из цикла, не имеет никакого значения — как только return инструкция выполняется во время первой итерации, цикл завершается.

Должно сработать следующее:

 def handler():
    ec2 = boto3.resource("ec2", region_name="ap-southeast-2")
    instances = ec2.instances.filter(Filters=[{'Name':'iam-instance-profile.arn', 'Values': ['arn:aws:iam::123456789012:instance-profile/TestRole']}])
    return tuple([instance.private_ip_address for instance in instances])
  

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

1. Нет, (instance.private_ip_address) это не кортеж. (instance.private_ip_address,) или instance.private_ip_address, было бы.

Ответ №2:

В вашем коде обработчика, когда вы используете a print вместо a return , это работает нормально, поскольку не прерывает цикл или функцию. Но когда Python обнаруживает возврат, он возвращает значение, которое мы просили его вернуть, и делает вывод, что функция end была достигнута. Это не продолжает цикл и не возвращает значение снова и снова.

Чтобы исправить свой код, используйте любую структуру данных на python, которая может содержать несколько значений, таких как кортеж или список, и добавьте любое значение, которое вам нужно вернуть к нему в цикле, и после завершения цикла верните структуру данных.