2010-06-21 47 views
35

在Python中,最簡潔的方式是「給我dict['foo']如果存在,如果不存在,給我這個其他值bar」?如果我是使用對象,而不是一本字典,我會使用getattrpython getattr等同於字典?

getattr(obj, 'foo', bar) 

但如果我嘗試使用字典,而不是(一個區別,我覺得不幸從JavaScript/CoffeeScript的未來)這提出了一個關鍵性的錯誤。同樣,在JavaScript/CoffeeScript中,我只寫

dict['foo'] || bar 

但是,這又會產生KeyError。該怎麼辦?東西簡潔,請!

回答

58

dict.get(key, default)返回dict[key]如果鍵入字典,則返回默認值。

注意,對於default默認爲None,所以如果你說dict.get(key)和關鍵不是字典,那麼這將直接返回None,而不是提出KeyError當您使用[]鍵訪問符號發生。

+0

感謝,這正是我一直在尋找!我想你只是設置一個新的速度記錄。 – 2010-06-21 23:44:46

+0

嘿,有可能這樣做只爲一個特定的特徵的關鍵... [這裏](http://stackoverflow.com/a/6467555/5961780),一個值只返回時,'鑰匙',或'名字',以字母'f'開頭。 – sbrm1 2016-10-06 03:52:25

5

另請參閱集合模塊的defaultdict類。這是一個字典,您可以指定在未找到密鑰時必須返回的內容。有了它,你可以做這樣的事情:

class MyDefaultObj: 
    def __init__(self): 
     self.a = 1 

from collections import defaultdict 
d = defaultdict(MyDefaultObj) 
i = d['NonExistentKey'] 
type(i) 
<instance of class MyDefalutObj> 

它允許你使用熟悉的d [i]約定。

然而,正如mikej說,獲得()也可以,但是這裏是形式更接近你的JavaScript示例:

d = {} 
i = d.get('NonExistentKey') or MyDefaultObj() 
# the reason this is slightly better than d.get('NonExistent', MyDefaultObj()) 
# is that instantiation of default value happens only when 'NonExistent' does not exist. 
# With d.get('NonExistent', MyDefaultObj()) you spin up a default every time you .get() 
type(i) 
<instance of class MyDefalutObj>