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

Fun*_*ayu 12 python if-statement try-catch

让我们举个简单的例子吧.

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 !"
Run Code Online (Sandbox Code Playgroud)

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

>>> foo("toto")
Odd !
>>> foo("foo")
Even !
>>> foo("kappa")
Uuuh not found.
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么我们不能在这样的elif语句中使用语句有一个特殊的原因try:

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 !"
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,因为它在try语句文档中elif定义,语句未定义.但为什么 ?是否有特殊原因(如绑定/未绑定变量)?这有什么消息来源吗?

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

Pad*_*ham 9

如果你问为什么那么这是python开发者的问题,语法在你链接的文档中明确定义.

除此之外,您尝试做的事情显然都可以在try/except中完成.如果你使用else属于try,就像你使用带有for循环的else一样,我认为只使用else而不允许它是完全elif合理的,elif的行为就像switch/case其他语言中的语句一样.

从游丝线程上的旧线程为什么没有'elif'在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.")
Run Code Online (Sandbox Code Playgroud)

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

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

if something:
  ...
elif something_else:
   ....
elif .....
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用默认值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 !")
Run Code Online (Sandbox Code Playgroud)

  • 但为什么一定是这样呢?(为什么Python的设计者以这种方式完成它?)这是原始问题的标题. (4认同)
  • 这个答案如何回答问题的 *为什么...?* 部分? (2认同)
  • @PadraicCunningham 所以争论是因为没有其他语言有它 python 也不应该有它?但是python具有其他语言中很少见的功能,fx缩进敏感性。请注意,只有少数语言有 `elif` - 哪些语言有它并且也有异常处理(该问题具有任何意义的先决条件)。我不知道任何其他语言具有这两种功能,因此恕我直言,与其他语言进行比较并不是很好的论据。是否有理由接受“elif”作为“try”语句的一部分是一个坏主意? (2认同)