Так что я бы сделал следующее, используя AWS cli. Создание целевой группы;
создать файл с именем, например, target-group.json с содержимым;
{
"Name": "nameOfTagretGroup",
"TargetType": "lambda"
}
, а затем запустить aws elbv2 create-target-group --cli-input-json target -group.json. Или используя только aws cli:
aws elbv2 create-target-group --name $targetName --target-type lambda
Затем создайте файл с именем, например, register-lambda.json, с содержимым;
{
"TargetGroupArn": "ARN_OF_CREATED_TARGET_GROUP",
"Targets": [
{
"Id": "Lambda_ARN",
"AvailabilityZone": "AZ_OF_YOUR_LAMBDA"
}
]
}
и затем запустите; aws elbv2 register-target --cli-input-json register-lambda.json. Или используя только ввод CLI;
aws elbv2 register-targets --target-group-arn $target_arn --targets Id=$Lambda_ARN,AvailabilityZone=AZ_OF_YOUR_LAMBDA
Я считаю, что это должно работать для вас и решить ваши проблемы.
S.Lott, очевидно, обнаружил некорректный код. там. Разве мы не все? Я не считаю другое вредным, хотя видел, как это использовалось для написания плохого кода. В этих случаях весь окружающий код тоже был плохим, так зачем еще винить бедных?
Нет, это не вредно, это необходимо.
Всегда должно быть общее заявление. Все переключатели должны иметь значение по умолчанию. Все сопоставления с образцом в языке ML должны иметь значение по умолчанию.
Аргумент о том, что невозможно рассуждать о том, что является истиной после серии операторов if, является фактом жизни. Компьютер - самый крупный конечный автомат, и глупо перечислять каждую возможность в каждой ситуации.
Если вы действительно боитесь, что неизвестные ошибки останутся незамеченными в операторах else, действительно ли так сложно вызвать исключение? есть?
Сказать, что else считается вредным, все равно что сказать, что переменные или классы вредны. Черт возьми, это все равно, что сказать, что goto вреден. Конечно, можно использовать не по назначению. Но в какой-то момент вам просто нужно доверять программистам быть взрослыми и быть достаточно умными, чтобы не делать этого.
Все сводится к следующему: если вы готовы не использовать что-то, потому что ответ на SO или сообщение в блоге или даже известная статья Дейкстры, в которой вам не говорили, вы должны подумать, является ли программирование подходящей для вас профессией.
Я бы не сказал, что это вредно, но бывают случаи, когда оператор else может доставить вам неприятности. Например, если вам нужно выполнить некоторую обработку на основе входного значения и есть только два действительных входных значения. Только проверка одного может привести к ошибке. например:
The only valid inputs are 1 and 2:
if(input == 1)
{
//do processing
...
}
else
{
//do processing
...
}
В этом случае использование else позволит обрабатывать все значения, кроме 1, тогда как это должно быть только для значений 1 и 2.
To me, the whole concept of certain popular language constructs being inherently bad is just plain wrong. Even goto
has its place. I've seen very readable, maintainable code by the likes of Walter Bright and Linus Torvalds that uses it. It's much better to just teach programmers that readability counts and to use common sense than to arbitrarily declare certain constructs "harmful".
Au contraire ... На мой взгляд, ДОЛЖЕН быть else для каждого if. Конечно, вы можете делать глупости, но вы можете злоупотреблять любой конструкцией, если будете достаточно стараться. Вы знаете поговорку «настоящий программист может написать FORTRAN на любом языке».
Я часто пишу часть else в качестве комментария, описывающего, почему ничего не поделаешь.
Если вы напишете:
if foo:
# ...
elif bar:
# ...
# ...
, читатель может задаться вопросом: что, если ни foo
, ни bar
не верны? Возможно, вы знаете, из вашего понимания кода, что это должно быть так, что либо foo
, либо bar
. Я бы предпочел увидеть:
if foo:
# ...
else:
# at this point, we know that bar is true.
# ...
# ...
или:
if foo:
# ...
else:
assert bar
# ...
# ...
Это проясняет читателю, как вы ожидаете, что управление будет течь, не требуя от читателя глубокого знания того, где foo
и bar
происходит от.
(в исходном случае вы все равно можете написать комментарий, объясняющий, что происходит, но я думаю, что тогда я задался бы вопросом: «Почему бы просто не использовать предложение else:
? ")
Думаю, дело не в том, что вы не должны использовать else:
; скорее, что an else:
Иначе наиболее полезно при документировании предположений о коде. Это гарантирует, что вы продумали обе стороны оператора if.
Всегда использовать предложение else с каждым оператором if даже рекомендуется в «Code Complete».
Обоснование включения оператора else
(из try ... else
) в Python в первую очередь состояло в том, чтобы поймать только те исключения, которые вы действительно хочу. Обычно, когда у вас есть блок try ... except
, есть некоторый код, который может вызвать исключение, а затем есть еще код, который должен выполняться только в том случае, если предыдущий код был успешным. Без блока else
вам пришлось бы поместить весь этот код в блок try
:
try:
something_that_might_raise_error()
do_this_only_if_that_was_ok()
except ValueError:
# whatever
Проблема в том, что если do_this_only_if_that_was_ok ()
вызывает a ValueError
? Он будет пойман оператором except
, когда вы, возможно, этого не хотели. В этом и заключается цель блока else
:
try:
something_that_might_raise_error()
except ValueError:
# whatever
else:
do_this_only_if_that_was_ok()
Думаю, это ' В некоторой степени это вопрос мнения, но лично я считаю, что это отличная идея, хотя я использую ее очень редко. Когда я его использую, он кажется мне очень подходящим (и, кроме того, я думаю, это помогает немного прояснить поток кода)
В примере, который сложно объяснить, это можно написать явно, но еще необходимо другое. Например,
if a < 10:
# condition stated explicitly
elif a > 10 and b < 10:
# condition confusing but at least explicit
else:
# Exactly what is true here?
# Can be hard to reason out what condition is true
Может быть написано
if a < 10:
# condition stated explicitly
elif a > 10 and b < 10:
# condition confusing but at least explicit
elif a > 10 and b >=10:
# else condition
else:
# Handle edge case with error?
Существует так называемая проблема "висячего другого", которая встречается в языках семейства C следующим образом:
if (a==4)
if (b==2)
printf("here!");
else
printf("which one");
Этот невинный код можно понять двояко:
if (a==4)
if (b==2)
printf("here!");
else
printf("which one");
или
if (a==4)
if (b==2)
printf("here!");
else
printf("which one");
Проблема в том, что «else» «болтается», можно сбить с толку владельца else. Конечно, компилятор не внесет эту путаницу, но это справедливо для смертных.
Благодаря Python у нас не может быть проблемы с зависшим else в Python, так как мы должны написать либо
if a==4:
if b==2:
print "here!"
else:
print "which one"
, либо
if a==4:
if b==2:
print "here!"
else:
print "which one"
Так что человеческий глаз бросается в глаза. И нет, я не думаю, что «else» вредно, оно так же вредно, как «если».
Мне кажется, что для любого языка и любого оператора управления потоком, где есть сценарий по умолчанию или побочный эффект, этот сценарий должен иметь одинаковый уровень рассмотрения. Логика в if, switch или while хороша ровно настолько, насколько хорошо условие if (x) while (x) или for (...). Следовательно, утверждение не является вредным, но логика в их состоянии вредна.
Поэтому, как разработчики, мы несем ответственность за кодирование с учетом широкой области остального. Слишком многие разработчики рассматривают его как «если не то, что сказано выше», хотя на самом деле он может игнорировать весь здравый смысл, потому что единственная логика в нем - отрицание предыдущей логики, которая часто бывает неполной. (ошибка разработки алгоритма)
Тогда я не считаю «else» более опасным, чем отдельные в цикле for () или плохое управление памятью. Все дело в алгоритмах. Если ваши автоматы полны по своему охвату и возможным ветвям, и все они конкретны и понятны, то опасности нет. Опасность заключается в неправильном использовании логики, стоящей за выражениями, людьми, не осознающими влияние широкомасштабной логики. Компьютеры глупы, они делают то, что им говорит их оператор (теоретически)
Я считаю попытку и уловку опасными, потому что это может свести на нет обработку неизвестного количества кода. Ветвление выше рейза может содержать ошибку, на которую указывает само повышение . Это может быть неочевидно. Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю С.
они делают то, что им говорит их оператор (теоретически)Я действительно считаю try и catch опасными, потому что это может свести на нет обработку до неизвестной величины кода. Ветвление выше рейза может содержать ошибку, на которую указывает само повышение . Это может быть неочевидно. Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю С.
они делают то, что им говорит их оператор (теоретически)Я действительно считаю try и catch опасными, потому что это может свести на нет обработку до неизвестной величины кода. Ветвление выше рейза может содержать ошибку, на которую указывает само повышение . Это может быть неочевидно. Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю С.
Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю С. Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю С. Я думаю, что суть в отношении try ... except ... else
заключается в том, что использовать его для create является простой ошибкой противоречивое состояние, а не исправить его. Это не значит, что этого следует избегать любой ценой, но это может быть контрпродуктивным.
Подумайте:
try:
file = open('somefile','r')
except IOError:
logger.error("File not found!")
else:
# Some file operations
file.close()
# Some code that no longer explicitly references 'file'
Было бы неплохо сказать, что вышеуказанный блок предотвращает попытку кода получить доступ к файлу, который не сделал ' t существует, или каталог, для которого у пользователя нет прав, и сказать, что все инкапсулировано, потому что оно находится в блоке try ... except ... else
. Но на самом деле большая часть кода в приведенной выше форме должна выглядеть так:
try:
file = open('somefile','r')
except IOError:
logger.error("File not found!")
return False
# Some file operations
file.close()
# Some code that no longer explicitly references 'file'
Вы часто обманываете себя, говоря, что, поскольку файл
больше не упоминается в области видимости, можно продолжать кодирование после блока, но во многих случаях возникает что-то, что просто не в порядке. Или, возможно, позже в блоке else
будет создана переменная, которая не создается в блоке except
.
Вот как я бы различал if .. .else
из попробуйте ... за исключением ... else
. В обоих случаях в большинстве случаев необходимо сделать блоки параллельными (переменные и состояние, установленные в одном, должны быть установлены в другом), но во втором кодеры часто этого не делают, вероятно, потому что это невозможно или неактуально. В таких случаях часто имеет гораздо больше смысла вернуться к вызывающему, чем продолжать работать над тем, что, по вашему мнению, у вас будет в лучшем случае.
else
будет создана переменная, которая не создается в блоке except
.
Вот как я бы различал if .. .else
из попробуйте ... за исключением ... else
. В обоих случаях в большинстве случаев необходимо сделать блоки параллельными (переменные и состояние, установленные в одном, должны быть установлены в другом), но во втором кодеры часто этого не делают, вероятно, потому что это невозможно или неактуально. В таких случаях часто имеет гораздо больше смысла вернуться к вызывающему, чем продолжать работать над тем, что, по вашему мнению, у вас будет в лучшем случае.
else
будет создана переменная, которая не создается в блоке except
.
Вот как я бы различал if .. .else
из попробуйте ... за исключением ... else
. В обоих случаях в большинстве случаев необходимо сделать блоки параллельными (переменные и состояние, установленные в одном, должны быть установлены в другом), но во втором кодеры часто этого не делают, вероятно, потому что это невозможно или неактуально. В таких случаях часто имеет гораздо больше смысла вернуться к вызывающему, чем продолжать работать над тем, что, по вашему мнению, у вас будет в лучшем случае.