在Python中,最简洁的说法是“给我dict['foo']
是否存在,如果不存在,请给我另外的价值bar
”?如果我使用的是对象而不是字典,我会使用getattr
:
getattr(obj, 'foo', bar)
但是如果我尝试使用字典(这是我发现不幸来自JavaScript / CoffeeScript的区别),这会引发一个关键错误。同样,在JavaScript / CoffeeScript中我只写
dict['foo'] || bar
但是,这又产生了一个KeyError。该怎么办?请一些简洁!
答案 0 :(得分:66)
dict.get(key, default)
如果键入dict则返回dict[key]
,否则返回默认值。
请注意default
的默认值为None
,因此,如果您说dict.get(key)
且密钥不在dict中,那么这只会返回None
而不是KeyError
1}}使用[]
密钥访问表示法时会发生这种情况。
答案 1 :(得分:5)
另请参阅集合模块的defaultdict类。这是一个dict,您可以指定在找不到密钥时必须返回的内容。有了它,你可以做以下事情:
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所说,.get()也可以,但是这里的表单更接近你的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>