TLDR 总结
我写了一个navigateDict
在 a 上进行安全导航的函数dict
,类似于dict.get()
但嵌套。它取代了类似的代码
if 1 in data and 'i' in data[1] and 'a' in data[1]['i']:
print data[1]['i']['a']
else:
print "Not found"
与大致相当
found = navigateDict(data, 1, 'i', 'a')
if found is not None:
print found
else:
print "Not found"
- 有什么类似于这已经是标准库的一部分吗?
- 有没有更惯用的方法来做同样的事情?
- 任何需要多次键入任何路径组件键的响应都可能是非答案。
额外细节
实现如下:
# Allow fallback value other than None
def navigateDictEx(d, keys, fallback=None):
for key in keys:
if key in d:
d = d[key]
else:
return fallback
return d
def navigateDict(d, *keys):
return navigateDictEx(d, keys)
有关示例用法,请参阅摘要。
不管是否是 Pythonic,这个函数在冗余是一个坏主意的地方减少了重复。例如,在示例中更改一个路径组件需要将最多三个不同的值修改为原始示例中的一个,但在修改后的示例中只需要一个。鉴于我经常犯错误的倾向,这是一个巨大的胜利。
最终我要问的是:标准库中有什么东西可以做到这一点,还是我需要在我的项目库中为它找到一个位置?
如果预计命中率会主导未命中率
brionius 正确地指出,捕捉KeyError
将起作用:
try:
print data[1]['i']['a']
except KeyError:
print "Not found"
这可能是我要走的路;它非常简洁,减少了重复。然而,它确实反映了一个假设,即命中比未命中要多。如果有更好的假设相反的方法,我也想知道。