小编典典

获取嵌套字典值的安全方法

all

我有一个嵌套字典。只有一种方法可以安全地获取价值吗?

try:
    example_dict['key1']['key2']
except KeyError:
    pass

或者 python 有一个类似get()嵌套字典的方法?


阅读 72

收藏
2022-05-25

共1个答案

小编典典

你可以使用get两次:

example_dict.get('key1', {}).get('key2')

None如果存在key1key2不存在,这将返回。

请注意,这仍然可以引发AttributeErrorif example_dict['key1']exists 但不是
dict(或带有get方法的类似 dict 的对象)。如果不可订阅,您发布的try..except代码将引发
aTypeError相反。example_dict['key1']

另一个区别是try...except在第一个丢失密钥之后立即发生短路。调用链get没有。


如果您希望保留语法,example_dict['key1']['key2']但不希望它引发 KeyErrors,那么您可以使配方:

class Hasher(dict):
    # https://stackoverflow.com/a/3405143/190597
    def __missing__(self, key):
        value = self[key] = type(self)()
        return value

example_dict = Hasher()
print(example_dict['key1'])
# {}
print(example_dict['key1']['key2'])
# {}
print(type(example_dict['key1']['key2']))
# <class '__main__.Hasher'>

请注意,当缺少键时,这将返回一个空的哈希器。

因为Hasher是一个子类,dict所以你可以像使用dict. 所有相同的方法和语法都可用,Hashers 只是以不同的方式处理丢失的键。

您可以将常规dict转换为Hasher这样的:

hasher = Hasher(example_dict)

并轻松地将 a 转换Hasher为常规dict

regular_dict = dict(hasher)

另一种选择是在辅助函数中隐藏丑陋:

def safeget(dct, *keys):
    for key in keys:
        try:
            dct = dct[key]
        except KeyError:
            return None
    return dct

因此,您的其余代码可以保持相对可读性:

safeget(example_dict, 'key1', 'key2')
2022-05-25