首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Python不在try语句上实现elif语句?

为什么Python不在try语句上实现elif语句?
EN

Stack Overflow用户
提问于 2015-08-20 18:07:26
回答 1查看 13.5K关注 0票数 17

所以让我们来做一个简单的例子。

代码语言:javascript
复制
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 !"

如您所见,上面的代码可以工作:

代码语言:javascript
复制
>>> foo("toto")
Odd !
>>> foo("foo")
Even !
>>> foo("kappa")
Uuuh not found.

我想知道为什么我们不能像这样将elif语句与try语句一起使用是不是有什么特殊的原因:

代码语言:javascript
复制
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 !"

当然,这是行不通的,因为它是在try statement documentation中定义的,所以没有定义elif语句。但是为什么呢?是否有特殊的原因(如绑定/未绑定变量)?这方面有什么消息来源吗?

(附注:没有elif-statement标签?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-20 18:13:42

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

除此之外,您尝试做的事情显然都可以在try/except中完成。如果你使用的是else,那么就像在for循环中使用else一样,我认为只使用else而不允许elif是非常有意义的,因为elif的行为就像其他语言中的switch/case语句一样。

从gossamer- thread Why no 'elif' in try/except?上的旧线程:

,因为它没有任何意义?

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

将两者混合在一起是没有意义的。在except子句中,没有要测试的结果;在else子句中,有。elif是应该在有异常的时候执行,还是在没有异常的时候执行?如果它只是else子句的一个扩展,那么我想它不会有任何坏处,但它会增加语言定义的复杂性。在我生命的这一点上,我倾向于同意爱因斯坦的观点--让一切尽可能简单,但不是更简单。我希望增加复杂性的最后一个地方(或者至少是最后一个地方)是在异常处理方面。

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

代码语言:javascript
复制
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开头:

代码语言:javascript
复制
if something:
  ...
elif something_else:
   ....
elif .....

另一种选择是对next使用默认值,然后使用if/elif/else,如果没有匹配的名称,则下一步将返回None,因此我们检查if value is not None,如果匹配,则打印"Uuuh not found.",否则,我们转到elif/else:

代码语言:javascript
复制
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 !")
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32115375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档