“еще” рассмотренный вредным в Python?

Так что я бы сделал следующее, используя 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

Я считаю, что это должно работать для вас и решить ваши проблемы.

11
задан Community 23 May 2017 в 12:09
поделиться

13 ответов

S.Lott, очевидно, обнаружил некорректный код. там. Разве мы не все? Я не считаю другое вредным, хотя видел, как это использовалось для написания плохого кода. В этих случаях весь окружающий код тоже был плохим, так зачем еще винить бедных?

30
ответ дан 3 December 2019 в 00:38
поделиться

Нет, это не вредно, это необходимо.

Всегда должно быть общее заявление. Все переключатели должны иметь значение по умолчанию. Все сопоставления с образцом в языке ML должны иметь значение по умолчанию.

Аргумент о том, что невозможно рассуждать о том, что является истиной после серии операторов if, является фактом жизни. Компьютер - самый крупный конечный автомат, и глупо перечислять каждую возможность в каждой ситуации.

Если вы действительно боитесь, что неизвестные ошибки останутся незамеченными в операторах else, действительно ли так сложно вызвать исключение? есть?

15
ответ дан 3 December 2019 в 00:38
поделиться

Сказать, что else считается вредным, все равно что сказать, что переменные или классы вредны. Черт возьми, это все равно, что сказать, что goto вреден. Конечно, можно использовать не по назначению. Но в какой-то момент вам просто нужно доверять программистам быть взрослыми и быть достаточно умными, чтобы не делать этого.

Все сводится к следующему: если вы готовы не использовать что-то, потому что ответ на SO или сообщение в блоге или даже известная статья Дейкстры, в которой вам не говорили, вы должны подумать, является ли программирование подходящей для вас профессией.

7
ответ дан 3 December 2019 в 00:38
поделиться

Я бы не сказал, что это вредно, но бывают случаи, когда оператор else может доставить вам неприятности. Например, если вам нужно выполнить некоторую обработку на основе входного значения и есть только два действительных входных значения. Только проверка одного может привести к ошибке. например:

The only valid inputs are 1 and 2:

if(input == 1)
{
   //do processing
   ...
}
else
{
   //do processing 
   ...
}

В этом случае использование else позволит обрабатывать все значения, кроме 1, тогда как это должно быть только для значений 1 и 2.

7
ответ дан 3 December 2019 в 00:38
поделиться

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".

6
ответ дан 3 December 2019 в 00:38
поделиться

Au contraire ... На мой взгляд, ДОЛЖЕН быть else для каждого if. Конечно, вы можете делать глупости, но вы можете злоупотреблять любой конструкцией, если будете достаточно стараться. Вы знаете поговорку «настоящий программист может написать FORTRAN на любом языке».

Я часто пишу часть else в качестве комментария, описывающего, почему ничего не поделаешь.

3
ответ дан 3 December 2019 в 00:38
поделиться

Если вы напишете:

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:

4
ответ дан 3 December 2019 в 00:38
поделиться

Иначе наиболее полезно при документировании предположений о коде. Это гарантирует, что вы продумали обе стороны оператора if.

Всегда использовать предложение else с каждым оператором if даже рекомендуется в «Code Complete».

3
ответ дан 3 December 2019 в 00:38
поделиться

Обоснование включения оператора 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()

Думаю, это ' В некоторой степени это вопрос мнения, но лично я считаю, что это отличная идея, хотя я использую ее очень редко. Когда я его использую, он кажется мне очень подходящим (и, кроме того, я думаю, это помогает немного прояснить поток кода)

2
ответ дан 3 December 2019 в 00:38
поделиться

В примере, который сложно объяснить, это можно написать явно, но еще необходимо другое. Например,

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?
0
ответ дан 3 December 2019 в 00:38
поделиться

Существует так называемая проблема "висячего другого", которая встречается в языках семейства 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» вредно, оно так же вредно, как «если».

1
ответ дан 3 December 2019 в 00:38
поделиться

Мне кажется, что для любого языка и любого оператора управления потоком, где есть сценарий по умолчанию или побочный эффект, этот сценарий должен иметь одинаковый уровень рассмотрения. Логика в if, switch или while хороша ровно настолько, насколько хорошо условие if (x) while (x) или for (...). Следовательно, утверждение не является вредным, но логика в их состоянии вредна.

Поэтому, как разработчики, мы несем ответственность за кодирование с учетом широкой области остального. Слишком многие разработчики рассматривают его как «если не то, что сказано выше», хотя на самом деле он может игнорировать весь здравый смысл, потому что единственная логика в нем - отрицание предыдущей логики, которая часто бывает неполной. (ошибка разработки алгоритма)

Тогда я не считаю «else» более опасным, чем отдельные в цикле for () или плохое управление памятью. Все дело в алгоритмах. Если ваши автоматы полны по своему охвату и возможным ветвям, и все они конкретны и понятны, то опасности нет. Опасность заключается в неправильном использовании логики, стоящей за выражениями, людьми, не осознающими влияние широкомасштабной логики. Компьютеры глупы, они делают то, что им говорит их оператор (теоретически)

Я считаю попытку и уловку опасными, потому что это может свести на нет обработку неизвестного количества кода. Ветвление выше рейза может содержать ошибку, на которую указывает само повышение . Это может быть неочевидно. Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю С.

они делают то, что им говорит их оператор
(теоретически)

Я действительно считаю try и catch опасными, потому что это может свести на нет обработку до неизвестной величины кода. Ветвление выше рейза может содержать ошибку, на которую указывает само повышение . Это может быть неочевидно. Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю С.

они делают то, что им говорит их оператор (теоретически)

Я действительно считаю try и catch опасными, потому что это может свести на нет обработку до неизвестной величины кода. Ветвление выше рейза может содержать ошибку, на которую указывает само повышение . Это может быть неочевидно. Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю С.

Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю С.

Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю С.

1
ответ дан 3 December 2019 в 00:38
поделиться

Я думаю, что суть в отношении 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 . В обоих случаях в большинстве случаев необходимо сделать блоки параллельными (переменные и состояние, установленные в одном, должны быть установлены в другом), но во втором кодеры часто этого не делают, вероятно, потому что это невозможно или неактуально. В таких случаях часто имеет гораздо больше смысла вернуться к вызывающему, чем продолжать работать над тем, что, по вашему мнению, у вас будет в лучшем случае.

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

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

0
ответ дан 3 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: