您可以使用
get两次:
example_dict.get('key1', {}).get('key2')
None如果存在
key1或
key2不存在,它将返回。
请注意,这仍然可以引发
AttributeErrorif
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')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)