2015-08-20 127 views
5

所以我們來舉個簡單的例子吧。爲什麼Python在try語句中沒有實現elif語句?

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. 

我只是想知道,如果有,爲什麼我們不能用try語句像這樣使用elif語句特別的原因:

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標籤?)

+0

如果這是需要 –

+0

您沒有前等等...不?因爲'if'語句會成爲一個新塊? – FunkySayu

+0

@FunkySayu爲什麼不在try中加入if語句 – The6thSense

回答

3

如果你問爲什麼那麼對於開發者蟒蛇一個問題,語法在docs您鏈接到明確界定。

除此之外,你正在嘗試做的顯然都可以在try/except內部完成。如果你使用一個else,它屬於try,就像當你用for循環使用else時一樣,我認爲只使用else並且不允許elif是理想的,elif在那裏表現得像其他語言的switch/case語句。

從一個古老的線程上游絲線程Why no 'elif' in try/except?

因爲它是沒有意義?

except子句用於處理異常,else 子句用於處理一切正常工作的情況。

混合兩者是沒有意義的。在除外條款中, 不是測試結果;在另一個條款中,有。當有異常時,或者當沒有異常時,是否應該執行elif假設 ? 如果它只是else子句的擴展,那麼我認爲 不會損害任何東西,但會增加語言 定義的複雜性。在我這一生的這一點上,我傾向於同意愛因斯坦 - 儘可能簡單,但並不簡單。最後的 的地方(或者至少有一個最後的地方)我想要額外的 複雜度在異常處理。

您總是至少需要一個if才能使用elif,它只是無效的語法而已。可能最終沒有被定義的唯一的事情是value,/你應該將邏輯的嘗試中,除了使用的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.")將被執行,如果不是你,然後你如果/別的會。

你可以有多個ELIF的,但你必須啓動,如果:

if something: 
    ... 
elif something_else: 
    .... 
elif ..... 

另一種選擇是使用具有next默認值,然後使用if/elif/else,如果我們沒有一個匹配名稱將返回None,所以我們檢查if value is not None,如果是我們打印"Uuuh not found."要不我們得到了一致的姓名所以我們去的elif /其他:

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

優秀的答案---雖然我認爲你可以用「should」替換單詞「can」,意思是「 try'和'except'正是那些在例外情況下沒有意義的代碼應該去的地方。 –

+0

@JohnColeman,True,編輯 –

+1

此答案如何回答* why *?*部分問題? – pts

相關問題