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

获取嵌套字典值的Python安全方法,第1张

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

您可以使用

get
两次:

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

None
如果存在
key1
key2
不存在,它将返回。

请注意,这仍然可以引发

AttributeError
if
example_dict['key1']
存在但不是dict(或带有
get
方法的类似dict的对象)。
try..except
如果发布的代码无法订阅,则会引发一个
TypeError
代替
example_dict['key1']

另一个区别是

try...except
在第一个丢失的键之后立即发生短路。
get
呼叫链没有。


如果您希望保留语法,

example_dict['key1']['key2']
但不希望它引发KeyErrors,则可以使用Hasher配方:

class Hasher(dict):    # https://stackoverflow.com/a/3405143/190597    def __missing__(self, key):        value = self[key] = type(self)()        return valueexample_dict = Hasher()print(example_dict['key1'])# {}print(example_dict['key1']['key2'])# {}print(type(example_dict['key1']['key2']))# <class '__main__.Hasher'>

请注意,如果缺少密钥,这将返回一个空的哈希器。

因为

Hasher
是的子类,所以
dict
您可以像使用一样使用Hasher
dict
。可以使用所有相同的方法和语法,而Hashers只是以不同方式对待丢失的密钥。

您可以将常规

dict
转换成
Hasher
这样:

hasher = Hasher(example_dict)

并轻松将其转换

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')


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5668042.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存