繁体   English   中英

python字典用dict.get()行为替换dict []运算符

[英]python dictionary replace dict[] operator with dict.get() behavior

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继承?

每次尝试访问不存在的键时,都可以使用collections.defaultdict()对象向字典添加新值:

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

如果您不想添加键,请创建实现__missing__方法dict的子类:

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

这显然不会添加新的键:

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

如果要链接 .get()调用,则必须返回一个空字典,否则dict.get(keyA).get(keyB)会因属性错误而失败(返回的第一个None不会包含.get()方法)。

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

value = some_d.get(outer, {}).get(inner)

使用带有自定义__missing__钩子的defaultdictdict子类有一个缺点:缺少键时,它们总是会产生默认值,即使您在代码中的其他地方意外地产生了不正确的键也是如此。 我经常选择相对于defaultdict的显式dict.get()dict.setdefault()代码路径,正是因为我希望一个不存在的键在项目的其他部分产生错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM