我想得到一个价值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()
Jon Clements.. 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)
如果您使用的是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)
像这样使用条件表达式
a[key] if key in a else b[key]
如果你想避免错误,如果它们都没有找到,你可以dict.get
像这样使用
a[key] if key in a else b.get(key,)
有一个丑陋的黑客,它使用一组词典来挑选最好的词典
(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
.