python dictionary用dict.get()行为替换dict []操作符

时间:2017-10-03 11:50:46

标签: python python-2.7 dictionary inheritance operator-overloading

my_dict = {'a': 1}

我希望my_dict['a']的行为与my_dict.get('a')相同 这样,如果我执行my_dict['b'],我就不会提出错误但会获得默认的None值,就像从my_dict.get('b')

获取它一样

如果是my_dict = {'a': {'b': 2}},我可以my_dict['a']['b'],它会充当my_dict.get('a').get('b')

执行my_dict['b'] = 2时,它将与my_dict.update({'b': 2})

相同

是否可以这样做,我不必从dict继承?

1 个答案:

答案 0 :(得分:5)

每次尝试访问不存在的密钥时,都可以使用collections.defaultdict() object 新值添加到字典中:

>>> from collections import defaultdict
>>> d = defaultdict(lambda: None)
>>> d['a'] is None
True
>>> d
defaultdict(<function <lambda> at 0x10f463e18>, {'a': None})

如果您不想添加密钥,请创建实现__missing__ methoddict的子类:

class DefaultNoneDict(dict):
    def __missing__(self, key):
        return None

这显然不会添加新密钥:

>>> d = DefaultNoneDict()
>>> d['a'] is None
True
>>> d
{}

如果你想 .get()调用,你必须返回一个空字典,否则dict.get(keyA).get(keyB)会因属性错误而失败(第一个{{ 1}}返回将没有None方法。

一般来说,最好坚持默认类型并明确。没有错:

.get()

使用value = some_d.get(outer, {}).get(inner) defaultdict子类与自定义dict挂钩有一个缺点:当密钥丢失时,他们总是产生默认值,甚至当你不小心在代码中的其他地方生成了错误的密钥时。我经常在__missing__上选择明确的dict.get()dict.setdefault()代码路径,因为我希望一个不存在的密钥在我项目的其他部分产生错误。