所以让我们来做一个简单的例子。
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
标签?)
发布于 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:
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 !")
https://stackoverflow.com/questions/32115375
复制相似问题