2010-06-21 45 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>