为什么Python没有在try语句上实现elif语句?

时间:2015-08-20 10:07:26

标签: python if-statement try-catch

所以,让我们举个简单的例子。

private RadioGroup chilledGroup;
public void setChilledFromView()
    {
        int selectedId = chilledGroup.getCheckedRadioButtonId();
        chilledRadioBtn = (RadioButton) getView().findViewById(selectedId);
        isChilled = chilledRadioBtn.getText().toString();

        if (gender.equals("true")) {
            isChilled = "chilled deliver";
        } else if (gender.equals("false") {
            isChilled = "it is not chilled deliver";
        }
    }

如您所见,上面的代码有效:

my_list = [
    {"name": "toto", "value": 3},
    {"name": "foo", "value": 42},
    {"name": "bar", "value": 56}
]

def foo(name):
    try:
        value = next(e["value"] for e in my_list if e["name"] == name)
    except StopIteration:
        print "Uuuh not found."
    else:
        if value % 2:
            print "Odd !"
        else:
            print "Even !"

我只是想知道为什么我们不能将>>> foo("toto") Odd ! >>> foo("foo") Even ! >>> foo("kappa") Uuuh not found. 语句与elif语句一起使用,这是否有特殊原因:

try

当然,这不起作用,因为它在try statement documentation中定义,try: value = next(e["value"] for e in my_list if e["name"] == name) except StopIteration: print "Uuuh not found." elif value % 2: print "Odd !" else: print "Even !" 语句未定义。但为什么 ?是否有特殊原因(如绑定/未绑定变量)?这有什么消息来源吗?

(旁注:没有elif标签?)

1 个答案:

答案 0 :(得分:8)

如果你问为什么那么python开发者的问题,语法在你链接的docs中明确定义。

除此之外,您尝试做的事情显然都可以在try / except中完成。如果你使用其他属于尝试的尝试与使用带有for循环的else相同,我认为仅使用else并且不允许使用elif是完全合理的,elif' s是表现得像其他语言中的switch/case语句。

来自游丝线程的旧帖子Why no 'elif' in try/except?

  

因为没有意义?

     

except子句用于处理异常,else   条款用于处理一切正常的情况。

     

将两者混合是没有意义的。在一个except子句中,那里   没有结果要考验;在else子句中,有。是elif的假设   在有例外或没有例外情况时执行?   如果它只是else子句的扩展,那么我想它   不会伤害任何东西,但它增加了语言的复杂性   定义。在我生命的这一点上,我倾向于同意爱因斯坦 -   让一切尽可能简单,但并不简单。最后   地方(或至少其中一个最后的地方)我想要额外的   复杂性在于异常处理。

你总是需要至少一个如果使用elif,它只是无效的语法而没有。唯一可能最终没有定义的是value,你应该在try /中移动逻辑,除非使用if / else:

try:
    value = next(e["value"] for e in my_list if e["name"] == name)
    if value % 2:
        print("Odd !")
    else:
        print("Even !")
except StopIteration:
    print("Uuuh not found.")

如果value = next...错误导致print("Uuuh not found.")被执行,如果不是,那么你的if / else将会执行。

您可以拥有多个elif,但必须以if:

开头
if something:
  ...
elif something_else:
   ....
elif .....

另一种选择是使用默认值next然后使用if/elif/else,如果我们没有匹配名称,则会返回None,所以我们检查if value is not None,如果是我们是打印"Uuuh not found."还是我们得到了一个匹配的名字,所以我们去了elif / else:

value = next((e["value"] for e in my_list if e["name"] == name), None)
if value is None:
    print("Uuuh not found.")
elif value % 2:
    print("Odd !")
else:
    print("Even !")