我想从a
获取一个值。如果无法在那里找到,请尝试从b
获取。如果无法在b
中找到,则抛出异常。
a.get(key, b[key])
无法正常工作,因为它无法评估b[key]
。
正确的方法是什么?
以下工作但似乎有点冗长。
value = a.get(key, b.get(key, 'not found'))
if value == 'not found':
raise Exception()
答案 0 :(得分:12)
如果您使用的是3.3+,则可以使用ChainMap
from collections import ChainMap
a = {'a': 1}
b = {'b': 2}
# Add as many `dict`s as you want in order of priority...
chained = ChainMap(a, b)
print(chained['b'])
如果您只对检索感兴趣并且没有3.3+可用,那么您可以推出自己的辅助功能:
def whatever(key, *args):
for mapping in args:
try:
return mapping[key]
except KeyError:
pass
raise KeyError(key)
然后将其用作value = whatever('somekey', a, b)
答案 1 :(得分:6)
使用条件表达式,如下所示
a[key] if key in a else b[key]
如果您想避免错误,如果在两者中都找不到错误,您可以使用dict.get
,就像这样
a[key] if key in a else b.get(key, <default_value>)
有一个丑陋的黑客,它使用一组词典来挑选最好的一个
(b, a)[key in a].get(key)
如果你想获得关键错误,你可以使它更奇怪,
(b, a)[key in a][key]
如果a
确实位于key
,这将选择a
,因为布尔表达式等效于1(True
)和0(False
) 。因此,(b, a)[True]
会选择a
而False
会选择a
。