字典的Python getattr等价方法?

71 投票
2 回答
47987 浏览
提问于 2025-04-16 00:16

在Python中,怎么用最简洁的方式表达“如果存在dict['foo']就给我这个,如果不存在就给我另一个值bar”呢?如果我用的是对象而不是字典,我会用getattr

getattr(obj, 'foo', bar)

但是如果我试着用字典,这样就会出现一个键错误(KeyError),这让我觉得很不方便,因为我之前用JavaScript/CoffeeScript的时候没有这个问题。同样,在JavaScript/CoffeeScript中我可以这样写:

dict['foo'] || bar

但是,这样同样会出现键错误。那该怎么办呢?希望能有个更简洁的方法!

2 个回答

6

另外,可以看看collections模块里的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所说,.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>
114

dict.get(key, default) 这个方法的意思是:如果字典里有你要找的键(key),就返回这个键对应的值;如果没有,就返回你指定的默认值。

需要注意的是,default 的默认值是 None,也就是说,如果你只写 dict.get(key) 而没有指定默认值,而这个键又不在字典里,那么它就会返回 None。这样就不会像用 [] 这种方式访问键时那样出现 KeyError 错误。

撰写回答