#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, которая может содержать несколько значений, таких как кортеж или список, и добавьте любое значение, которое вам нужно вернуть к нему в цикле, и после завершения цикла верните структуру данных.