您可以使用get
两次:
example_dict.get('key1', {}).get('key2')
None
如果存在key1
或key2
不存在,它将返回。
请注意,这仍然可以引发AttributeError
ifexample_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 value
example_dict = Hasher()
print(example_dict['key1'])
# {}
print(example_dict['key1']['key2'])
# {}
print(type(example_dict['key1']['key2']))
# <class '__main__.Hasher'>
请注意,如果缺少密钥,这将返回一个空的哈希器。
因为Hasher
是的子类,所以dict
您可以像使用一样使用Hasherdict
。可以使用所有相同的方法和语法,而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')