字典的Python getattr等价物?

2024-05-23 21:01:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,最简洁的说法是什么,“给我dict['foo']如果它存在,如果不存在,给我另一个值bar”?如果我使用的是对象而不是字典,我会使用getattr

getattr(obj, 'foo', bar)

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

dict['foo'] || bar

但是,同样,这会产生一个关键错误。怎么办?请给我些简洁的东西!


Tags: 对象obj字典foo错误barjavascriptdict
2条回答

dict.get(key, default)返回dict[key]如果键在dict中,则返回默认值。

注意,default的默认值是None,所以如果您说dict.get(key)并且键不在dict中,那么这将只返回None,而不是像使用[]键访问符号时那样引发KeyError

还要看一下collections模块的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>

相关问题 更多 >