2014-10-17 125 views
1

我有一個看起來像這樣的代碼:是否有可能返回異常?

try: 
    a = form['a'] 
except KeyError: 
    pass 
try: 
    b = form['b'] 
except KeyError: 
    pass 
try: 
    c = form['c'] 
except KeyError: 
    pass 
try: 
    d = form['d'] 
except KeyError: 
    pass 

它是更多鈔票,以做這樣的事情:

try: 
    a = form['a'] 
    b = form['b'] 
    c = form['c'] 
    d = form['d'] 
except KeyError: 
    somekeyword 

所以,如果沒有鑰匙「a」的形式仍在工作,並嘗試找到'b'等密鑰

UPD: 對不起,我的壞。我需要保留所有的價值,而不僅僅是其中的一種。 所以我需要關鍵字或類似的東西,這將幫助我繼續嘗試塊,即使異常提出後。

+0

是的,你當然可以這樣做。 – avi 2014-10-17 10:40:50

+1

你可以使用'user = form.get('a')',並且當這個鍵不存在時默認返回'None' ... – 2014-10-17 10:43:30

+0

你*可以做到這一點,但它的工作原理是不同的 - 前者仍然嘗試'user = form ['b']'user = form ['a']'是否失敗,而後者不會。 – jonrsharpe 2014-10-17 10:43:55

回答

3

如果form是一本字典,你也可以使用.get(key, [default])語法:

>>> form = {'d':5} 
>>> form.get('a', form.get('b', form.get('c', form['d']))) 
5 

您可以進行功能通過使用一些迭代器調用

>>> from itertools import dropwhile 
>>> it = (form.get(k) for k in ['a', 'b', 'c', 'd']) 
>>> next(dropwhile(lambda val: val is None, it)) 
5 

編輯 :如果你需要全部四個:

>>> a, b, c, d = map(form.get, ['a', 'b', 'c', 'd']) 
>>> a, b, c, d 
(None, None, None, 5) 
+0

['iter'](https://docs.python.org/2/library/functions.html#iter)是一個內置函數,不要用它作爲變量名。 – 2014-10-17 11:01:29

+0

@BurhanKhalid非常真實!修正了! – 2014-10-17 11:04:31

+0

請注意,您可以從列表中解壓,所以'a,b,c,d = map(form.get,['a','b','c','d'])'也可以。如果我們保證鍵是可以縮短爲'a,b,c,d = map(form.get,'abcd')'' – 2014-10-17 12:09:00

0

你可以簡單地做到這一點,假設形式支持完整的字典語義,並且沒有實際的形式是一個有效的值:

sentinel = object() 
user = sentinel 
for key in "abcd": 
    user = form.get(key, user) 
if user is sentinel: # I don't know if None is a va 
    whatever-you-mean-with-somekeyword 
+2

Python的單個字符,則Python支持'for ... else'構造,這樣你不必像這樣惹惱哨兵。 – progo 2014-10-17 10:52:27

+0

你能否詳細說明這會對此有所幫助? AFAIK它只是關於如果循環內有中斷的情況下運行代碼。這有什麼幫助? – deets 2014-10-17 10:59:46

+0

如果數值範圍足夠大,哨兵本身有時會出現問題。儘管該算法不會再1:1相同,但當出現合適的值時,儘早破解也是經常需要的。可以說,使用明確的構造是一個更加Pythonic的事情。 – progo 2014-10-17 11:35:30

相關問題