【问题标题】:Why does Python not implement the elif statement on try statement?为什么 Python 没有在 try 语句上实现 elif 语句?
【发布时间】:2015-11-13 22:13:40
【问题描述】:

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

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:
    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标签?)

【问题讨论】:

  • 如果需要,你没有前面的
  • 等等...不是吗?因为if 语句将是一个新块?
  • @FunkySayu 为什么不在 try 块中添加 if 语句
  • 您应该使用 if 并将 if/else 移动到 try 中。如果有错误if/else不会被执行,就是成功了就会

标签: python if-statement try-catch


【解决方案1】:

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

除此之外,您尝试做的事情显然都可以在 try/except 中完成。如果您使用 else 它属于 try 与使用带有 for 循环的 else 时相同,我认为仅使用 else 而不允许 elif 是完全有意义的,elif 的行为类似于 switch/case 语句其他语言。

来自游丝线程Why no 'elif' in try/except? 上的一个旧线程:

因为没有意义?

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

将两者混为一谈毫无意义。在 except 子句中,有 没有要测试的结果;在 else 子句中,有。 elif 是不是应该的 有异常时执行,还是没有异常时执行? 如果它只是对 else 子句的扩展,那么我想它 不会伤害任何东西,但会增加语言的复杂性 定义。在我生命中的这一点上,我倾向于同意爱因斯坦的观点—— 让一切尽可能简单,但不要更简单。最后 地点(或至少最后几个地点之一)我想要额外的 复杂性在于异常处理。

你总是需要至少一个 if 来使用 elif,没有它就是无效的语法。唯一可能最终没有被定义的是value,你应该使用 if/else 移动 try/except 中的逻辑:

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 !")

【讨论】:

  • 优秀的答案 --- 虽然我认为你可以用“应该”替换“可以”这个词,因为tryexcept 之间的块正是代码不存在的地方在应该去的例外情况下没有意义。
  • 这个答案如何回答问题的为什么...?部分?
  • 但为什么必须这样呢? (为什么 Python 的设计者会这样做?)这就是原始问题的标题。
  • @ElRuso,不,我们正在检查 None 不是虚假值,唯一可能导致副作用的值是该值是否为 None
  • @PadraicCunningham 所以争论是因为没有其他语言有它,python也不应该有它?但是python具有其他语言中很少见的特性,fx缩进敏感性。请注意,只有少数语言有 elif - 哪些语言有它并且还有异常处理(问题具有任何意义的先决条件)。我不知道任何其他具有这两种功能的语言,因此与其他语言比较不是恕我直言的好论据。接受elif 作为try 声明的一部分是一个坏主意,有什么理由吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2020-10-28
  • 2015-01-16
  • 1970-01-01
相关资源
最近更新 更多