您如何看待这种新的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()

因此,基本上then可以在其他条件以外的任何条件下运行a。您认为这有用吗?它类似于python的try-except-else。

我认为你们中的一些人正在确定一个非常初步的实施方案。该then块就像python 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,2010年

6
+1表示愿意思考,但我不会投票赞成实际实施。请在下面查看我的答案。
桑科旺科(Wonko the Sane),2010年

1
那么“那么”的行为就像finallyJava中的行为吗?
Alex Feinman

1
我觉得then有点混乱。通常then隐含在if。之后。我的意思是,你说的if condition, then stuff(),但再继续说then stuff that applies to both
马特Olenik

2
+1是一个有趣的思想练习,但我同意在“坏主意”下提出的答案。这只是不直观,我可以看到这确实使一些编码器绊倒了。
BlairHippo 2010年

Answers:


17

我觉得这太可怕了。如果希望代码在各种条件下运行,则(a)重新检查这些条件或(b)将变量设置为指示的成功状态。


2
我同意-如果没有您的解释就很难理解其含义。
tcrosley

为什么需要解释某件事情的工作方式太过期望了?
法尔马里(Falmarri)2010年

5
因为它使代码更难阅读。
Antsan

我不确定这是否公平。代码中的每个构造都必须解释一次。
Magus 2014年

14

通常,您已经可以使用一个开关/箱来做到这一点,并且一个开关/箱可以对您的建议进行更精细的控制。

它在逻辑上也无法正确读取。如果A否则B,则C。如果A或B的评估结果为true,则并不意味着C将被执行。


2
Python没有switch / case语句
Falmarri 2010年

2
我不认为这个问题是直接针对Python唯一答案的,但是如果这是意图,也请标记为Python。
Brian R. Bondy 2010年

好吧,它不是直接针对python的。该示例在python中。但是,如果您对不需要这样做的回答是“有switch语句”,那么python就没有这些。
Falmarri 2010年

1
@Falmarri:很公平,所以我想我的答案是Python更好地支持经典的switch语句。
Brian R. Bondy 2010年

问题中的代码使用Python并不意味着问题与Python有关,因为这也可以是伪代码。如果仅关于Python,则应将其标记为这样
phuclv

8

有趣,但对我来说(以我的方式设置)似乎是对可读性,逻辑和语法问题的邀请。

编辑: 您的if-elif非常简单-如果有10个elif怎么办?20吗 所有条件都必须为真吗?那有什么机会?
您的if-elif非常简单-如果有10个elif,该怎么办?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()”函数添加到两个非默认条件中-我只是这样做,因此看起来更像上面定义的语法,尽管“ then”而不是“其他”。

因此,在我看来,这是一种非常专业的语法,其中更通用的语法更胜一筹。

+1考虑可能的功能(继续这样做!),但我不会投票赞成实施该功能。


1
+1代表“
久经考验的

what if there were 10 elifs? 20? Would all conditions need to be true?那不可能 只有1个elif可以为真,因为它停止评估更多。
Falmarri 2010年

我的错误-当您表示“或”时,我将其读为“和”。但是,我支持我的回答-我将从您指出的内容中进行更新。
桑科旺科(Wonko the Sane),2010年

您是否真的认为在此发布的语法比我建议的清晰?您不仅要检查条件两次,而且非嵌套总是比嵌套更好
Falmarri 2010年

1
就像您的情况一样,除非您的“当时”确实适用于所有条件,否则随着您添加的条件越来越多,这种可能性就会越来越小。就个人而言,来自C / C ++ / C#背景,我发现嵌套要比拆分语法少很多(例如,在“ if”或“ elsif”中做一些事情,然后跳下来做一些事情) 。否则在“然后”我自己发现的语法更具可读性拥有所有条件一起可能不适合,但它是我的一天到一天的世界更成熟的概念。
Wonko理智的

2

我今天不介意使用这样的东西。但是,请确保我会像使用重复直到那样频繁地使用它。

没有多余的嵌套,代码至少看起来会更好。虽然我更喜欢Else Ifelif。我想更换ThenDo和最终Else使用Otherwise


和python的创建者谈谈,而不是我=]
Falmarri 2010年

哦,我以为您正在设计一种新语言。我只是建议将名称更改为更精确的名称,如果需要,可以省略elif,但最后一点似乎应该与常规名称区分开。
彼得·特纳

好吧,它不一定适用于新语言,但也不一定适用于python。一般而言,这只是语法规则的一个新想法。这可以应用于副作用相对较少的任何语言。
Falmarri 2010年

0

这似乎是个好主意。但是,我想象的唯一问题是您更容易出现错误。就像编写if / else if并在then中调用blah()一样。如果不希望再写其他内容,请从那时开始删除等等,然后将其添加到您的ifs / elseifs中。然后,当您或另一个程序员添加另一个语句时,您可能希望调用blah,但不会。

或者,您可以有多个if,写一个等等,而忘记所有if,但是一个要求这样做会破坏某些东西。如果将它们放在if块下,还可能需要它们跟随每一个。可以在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语句检查它,但是它变得很复杂。
法尔马里(Falmarri)2010年

0

我发现您的语法令人困惑,但是我看到了这个概念的一些价值。从概念上讲,当我考虑了这个问题时,我发现自己想要的是一个“麻烦”,基本上可以在最后一个else没有触发的情况下执行操作。从这个角度来看,我建议人们可以通过以下方法实现类似的结果:

  做
  {
    如果(条件1)
      ...仅适用于condition1的内容
    否则,如果(condition2)
      ...仅适用于condition2的内容
    其他
    {
      ...没有条件的东西
      打破;
    }
    ...两种情况下的东西
  } while(0); //中断的延续点

在某些情况下,另一种选择可能是:

  如果((condition1 &&(action1,1))||
       (condition2 &&(action2,1))||
       (action_for_noth,0))
    action_for_two;

看上去有点讨厌,但是在某些情况下,除了复制代码或使用代码外goto,可能没有其他任何好的方法来表达所需的事件序列(除了可能有人插入此处的卡通外,可能还不错)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.