在Perl中,我可以这样做:
foo = a // b;
我想知道的是,Python是否有类似的东西。我已尝试过以下内容,但显然它不起作用:
foo = {'key1':'val1','key2':'val2'}
bar = foo['doesntexist'] or foo['key1']
我收到错误:
KeyError: 'doesntexist'
答案 0 :(得分:2)
您的方法不起作用的原因是因为Python在您的布尔表达式能够被计算之前引发错误。您需要使用.get()
而不是简单地索引字典。 .get()
不会引发错误,而是返回None
,以便正确评估您的表达式:
bar = foo.get('doesntexist') or foo.get('key1')
请注意,如果第一个键的值为0
或任何其他值为false的值,则您的方法将失败。如果这对您没问题,请使用上述方法。
但是,如果您不希望出现上述行为,则必须测试第一个值是否为None
。但是,在这一点上,最好将这个逻辑简单地提取到一个单独的函数中:
def get_key(d, test_key, default_key):
"""
Given a dictionary(d), return the value of test_key.
If test_key does not exists, return the default_key
instead.
"""
if d.get(test_key) is not None:
return d.get(test_key)
return d.get(default_key)
可以这样使用:
foo = {'key1':'val1','key2':'val2'}
bar = get_key(foo, 'doesntexist', 'key1')
答案 1 :(得分:2)
您根本不需要or
:
bar = foo.get('doesntexist', foo['key1'])