Что вы думаете об этом новом синтаксисе if-then [закрыто]


11

Я просто думал о чем-то, что было бы действительно круто иметь в моем контроле if-elif-else.


if condition:
    stuff()
elif condition:
    otherstuff()
then:
    stuff_that_applies_to_both()
else:
    stuff_that_doesnt_aply_to_either()

Таким образом, в основном выполняется a then, когда выполняется любое из условий, КРОМЕ другого условия. Как вы думаете, это полезно? Это похоже на попытку-кроме-еще Python.

Я думаю, что некоторые из вас придираются к очень предварительной реализации. thenБлок будет так же , как elseблок в try-exceptблоке в питоне. Настоящая причина, по которой я предлагаю это, - в таких ситуациях.


m = {}
if condition == '1':
    m['condition'] = condition
elif condition2 == '3':
    m['condition2'] = condition2
elif condition3 == 'False':
    m['condition3'] = True
then:
    run_test_that_relies_on_one_of_the_conditions_being_true()

return m

thenБлок распространяется до первой , если так же , как elseесть. Так что вложение работает нормально. И если вам нужно запустить метод перед операторами if, это на самом деле не имеет ничего общего с этим вариантом использования.


насколько это может быть вложенным?
— aggietech 19.10.10

6
+1 за нестандартное мышление, но я бы не стал голосовать за его реализацию. Смотрите мой ответ почему ниже.
— Wonko the Sane

1
Так «тогда» действует как finallyв Java?
— Алекс Фейнман

1
Я нахожу thenнемного запутанным. Обычно thenподразумевается, чтобы происходить после if. Я имею в виду, вы говорите, if condition, then stuff()но затем продолжите говоритьthen stuff that applies to both
— Мэтт Оленик

2
+1 для интересного упражнения мысли, но я согласен с ответами, подающими это под Плохой Идеей. Это просто не интуитивно понятно, и я мог видеть, что ДЕЙСТВИТЕЛЬНО это сбивает некоторых программистов.
— BlairHippo

Ответы:


17

Я думаю, это выглядит ужасно. Если вы хотите, чтобы код выполнялся после множества условий, то либо (a) перепроверьте эти условия, либо (b) установите переменную в указанное состояние успеха.


2
Я согласен - очень сложно понять, что это значит, без объяснения, такого как вы дали.
— tcrosley 19.10.10

Почему требуется объяснение того, как что-то работает слишком много, чтобы ожидать?
— Фальмарри

5
Потому что это затрудняет чтение кода.
— Antsan

Я не совсем уверен, что это справедливо. Каждая конструкция в коде должна быть объяснена один раз.
— Волхв

14

Как правило, вы уже можете сделать это с помощью переключателя / кейса, а переключатель / кейс обеспечивает более точное управление тем, что вы предлагаете.

Это также не читает правильно логически. Если A еще, если B, то C. Не подразумевает кого-то, что C будет выполняться, если либо A, либо B оценивают как true.


2
У Python нет операторов switch / case
— Falmarri 19.10.10

2
Я не думаю, что вопрос был сформулирован непосредственно для ответов только на Python, но если это было намерением, пожалуйста, пометьте также как Python.
— Брайан Р. Бонди

Ну, это не имеет прямого отношения к питону. Пример был на питоне. Но если вы ответили, почему это не нужно, «есть операторы переключения», то в Python их нет.
— Фальмарри

1
@Falmarri: Достаточно справедливо, поэтому я думаю, что мой ответ на этот вопрос будет состоять в том, что Python будет лучше поддерживать классические операторы switch.
— Брайан Р. Бонди

код в вопросе на Python не означает, что речь идет о Python, потому что это также может быть псевдокод. Если это только о Python, то он должен быть помечен как таковой
— phuclv

8

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

Редактировать: Ваш if-elif очень прост - что если бы было 10 elifs? 20? Все ли условия должны быть выполнены? Каковы шансы этого?
Ваш if-elif очень прост - что если бы было 10 elifs? 20? Разве это не сделает это довольно нечитаемым?

Кроме того, это может быть легко достигнуто проверенной методикой:

if (thisCondition or thatCondition)
{
  if (thisCondition)
     stuff();
  else
     otherstuff();

    stuff_that_applies_to_both();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Что произойдет, если «stuff_that_applies_to_both» должно произойти перед отдельными шагами? Ваш код не обрабатывает этот случай:

if (thisCondition or thatCondition)
{
  stuff_that_applies_to_both();

  if (thisCondition)
     stuff();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Наконец, этот синтаксис обеспечивает большую гибкость при большем количестве условий: if (thisCondition или thatCondition или anotherCondition) {stuff_that_applies_to_all ();

  // Any combination of the three conditions using 
  // whichever logical syntax you'd like here
  if (thisCondition and anotherCondition)
     stuff();
  else if (thisCondition or thatCondition)
     stuff_number_2();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Я использовал if / else, но мог бы так же легко использовать оператор switch с флагом:

Boolean conditionApplies = true;

switch (someConditionToCheck)
{
    case thisCondition:
      stuff();
      break;

    case thatCondition:
        otherStuff();
        break;

    default:
        stuff_that_doesnt_aply_sic_to_either();
        conditionApplies = false;
        break;
}

if (conditionApplies)
    stuff_that_applies_to_both();

Обратите внимание, что на самом деле мне не нужен флаг conditionApplies - я мог бы добавить функцию "stuff_that_applies_to_both ()" к обоим условиям, отличным от заданных по умолчанию, - я просто сделал это, чтобы он выглядел больше как синтаксис, определенный выше, хотя и "затем" а не "еще".

Поэтому, мне кажется, это очень специализированный синтаксис, где более общий синтаксис заполняет счет и многое другое.

+1 за мысль о возможной функции (продолжайте делать это!), Но я бы не стал голосовать за ее реализацию.


1
+1 за «проверенную и проверенную методологию» - если есть разумное решение проблемы, обычно лучше ее использовать :)
— bedwyr 19.10.10

what if there were 10 elifs? 20? Would all conditions need to be true?Это невозможно. только 1 элиф может быть правдой, потому что он перестает оценивать больше.
— Фальмарри

Моя ошибка - я читаю это как «и», когда вы имели в виду «или». Тем не менее, я поддерживаю свой ответ - я обновлю его из того, что вы указали.
— Вонко вменяемый

Вы действительно думаете, что синтаксис, который вы разместили здесь, более понятен, чем я предложил? Мало того, что вы проверяете свои условия дважды, но не вложенность всегда лучше, чем вложение
— Falmarri 19.10.10

1
Как и ваши, если ваше «тогда» действительно относится ко всем условиям, которые по мере того, как вы добавляете все больше и больше из них, становятся все менее вероятными. И лично, исходя из фона C / C ++ / C #, я нахожу вложение немного менее запутанным, чем разделенный синтаксис (то есть, делаю что-то здесь в «if» или, может быть, «elsif», а затем прыгаю вниз и делаю что-то иначе в «тогда». Лично я нахожу синтаксис более читабельным, чтобы все условия были вместе. Может быть, это неправильно, но это более устоявшаяся концепция в моем повседневном мире.
— Вонко, здравомыслящий

2

Я не возражал бы использовать что-то подобное сегодня. Но, чтобы быть уверенным, я буду использовать его примерно так же часто, как я повторяю до.

Код, по крайней мере, выглядел бы лучше без лишних вложений. Хотя я предпочитаю , Else Ifчтобы elif. Я бы заменить Thenс Doи окончательным Elseс Otherwise.


Хорошо поговорите с создателями питона, а не со мной =]
— Фальмарри

О, я думал, что вы разрабатываете новый язык. Я просто предложил изменить название, чтобы быть более точным, оставьте elif, если хотите, но этот последний вариант кажется отличным от обычного.
— Питер Тернер

Ну, это не обязательно для нового языка, но это не обязательно для Python. Просто новая идея для правила синтаксиса в целом. Это может быть применено к любому языку с относительно небольшим количеством побочных эффектов.
— Фальмарри

0

Это похоже на классную идею. Однако единственная проблема, которую я представляю, это то, что вы более склонны к ошибкам. Например, написать if / else if и вызвать blah () в then. Написание дополнительного else, если это не нужно, бла, удаление бла с этого момента и добавление его в ваши ifs / elseifs. Затем, когда вы или другой программист добавите еще одно утверждение, вы можете ожидать, что будет вызван бла, но нет.

Или вы можете иметь несколько ifs, написать бла и забыть все if, но один требует этого, что может что-то сломать. Также есть вероятность, что вы будете следовать им, если будете помещать его под блок if. Возможно, установив bool в else (NoUpdate = true) и просто напишите if (! NoUpdate) {}, прямо под которым он более понятен и может быть установлен if

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


Possibly setting a bool in else (NoUpdate=true) and just write a if(!NoUpdate) {} directly under which is clearer and can be set by an ifЭто именно то, что это должно предотвратить. В этом весь смысл заявления elif. Elif тоже не нужен, его можно проверить с помощью операторов if, но это усложняется.
— Фальмарри

0

Я нахожу ваш синтаксис запутанным, но я вижу некоторую ценность в концепции. Концептуально, когда я рассматривал проблему, то, что я обнаружил, что мне нужно, это «unelse», который в основном будет выполнять вещи в тех случаях, когда последний elseне срабатывает. Глядя на это с этой точки зрения, я бы предположил, что можно достичь аналогичного результата с помощью:

  делать
  {
    если (условие1)
      ... материал только для condition1
    еще если (условие2)
      ... материал только для condition2
    еще
    {
      ... вещи ни для каких условий
      перемена;
    }
    ... вещи для обоих условий
  } while (0); // Продолжение точки перерыва

Другой вариант может быть в некоторых случаях:

  if ((условие1 && (действие1,1)) ||
       (условие2 && (действие2,1)) ||
       (Action_for_neither, 0))
    action_for_either;

Немного неприятно выглядит, но в некоторых случаях может не быть хорошего способа выразить желаемую последовательность событий, кроме дублирования кода или использования goto(что может быть не так уж плохо, за исключением мультфильма, который кто-то может вставить сюда).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.