【发布时间】:2013-08-25 11:41:26
【问题描述】:
TLDR 总结
我编写了一个函数navigateDict,它在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)
查看摘要以了解示例用法。
不管是否是 Python 的,这个函数在冗余是一个坏主意的地方减少了重复。例如,在示例中更改一个路径组件需要将最多三个不同的值修改为原始示例中的一个,但在修改后的示例中只需要一个。鉴于我经常犯错,这是一个巨大的胜利。
最终我要问的是:标准库中有什么东西可以做到这一点,还是我需要在我的项目库中为它找到一个位置?
如果预期命中率高于未命中率
brionius 正确地指出捕捉KeyError 会起作用:
try:
print data[1]['i']['a']
except KeyError:
print "Not found"
这可能是我要走的路;它非常简洁,减少了重复。然而,它确实反映了一个假设,即命中比未命中要多。如果有更好的假设相反的方法,我也想知道。
【问题讨论】:
标签: python dictionary idioms