我有一个嵌套字典。只有一种方法可以安全地获取价值吗?
try: example_dict['key1']['key2'] except KeyError: pass
或者 python 有一个类似get()嵌套字典的方法?
get()
你可以使用get两次:
get
example_dict.get('key1', {}).get('key2')
None如果存在key1或key2不存在,这将返回。
None
key1
key2
请注意,这仍然可以引发AttributeErrorif example_dict['key1']exists 但不是 dict(或带有get方法的类似 dict 的对象)。如果不可订阅,您发布的try..except代码将引发 aTypeError相反。example_dict['key1']
AttributeError
example_dict['key1']
try..except
TypeError
另一个区别是try...except在第一个丢失密钥之后立即发生短路。调用链get没有。
try...except
如果您希望保留语法,example_dict['key1']['key2']但不希望它引发 KeyErrors,那么您可以使配方:
example_dict['key1']['key2']
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 只是以不同的方式处理丢失的键。
Hasher
dict
您可以将常规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')