Python getattr等价于字典?

Tre*_*ham 42 python

在Python中,最简洁的说法是" dict['foo']如果它存在就给我,如果不存在,给我这个其他价值bar"?如果我使用的是对象而不是字典,我会使用getattr:

getattr(obj, 'foo', bar)
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试使用字典(这是我发现不幸来自JavaScript/CoffeeScript的区别),这会引发一个关键错误.同样,在JavaScript/CoffeeScript中,我只是写

dict['foo'] || bar
Run Code Online (Sandbox Code Playgroud)

但是,这又产生了一个KeyError.该怎么办?东西简洁,拜托了!

mik*_*kej 70

dict.get(key, default)返回dict[key]如果密钥字典,否则返回默认值.

请注意,默认情况defaultNone如此,如果你说dict.get(key)并且键不在dict中那么这将返回None而不是KeyError像使用[]密钥访问表示法时那样提高.


ddo*_*nko 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>
Run Code Online (Sandbox Code Playgroud)

这允许您使用熟悉的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>
Run Code Online (Sandbox Code Playgroud)