Python 什么';It’从一个目录中获取项目是一种简单的方法,如果找不到,从另一个目录中获取?

Python 什么';It’从一个目录中获取项目是一种简单的方法,如果找不到,从另一个目录中获取?,python,dictionary,Python,Dictionary,我想从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() 使用条件表达式,如下所示 a[key] if key in a else b[key] a[k

我想从
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()

使用条件表达式,如下所示

a[key] if key in a else b[key]
a[key] if key in a else b.get(key, <default_value>)
如果要避免错误,如果在这两个文件中都找不到,可以使用
dict.get
,如下所示

a[key] if key in a else b[key]
a[key] if key in a else b.get(key, <default_value>)
如果你想得到关键错误,你可以让它更奇怪

(b, a)[key in a][key]

如果
key
确实位于
a
中,这将选择
a
,因为布尔表达式相当于1(
True
)和0(
False
)。因此,
(b,a)[True]
将选择
a
False
将选择
a
,如果您使用的是3.3+,您可以使用

如果您只对检索感兴趣,并且没有3.3+可用,那么您可以使用自己的助手功能:

def whatever(key, *args):
    for mapping in args:
        try:
            return mapping[key]
        except KeyError:
            pass
    raise KeyError(key)

然后将其用作
value=which('somekey',a,b)

Downvoter,如果您仍然在场,请解释我如何改进此答案。如果以后您决定不想使用
KeyError
,您仍然可以执行
链接。获取('c',3)