Python有像Perl这样的定义或运算符吗?

时间:2017-03-04 01:06:51

标签: python

在Perl中,我可以这样做:

foo = a // b;

我想知道的是,Python是否有类似的东西。我已尝试过以下内容,但显然它不起作用:

foo = {'key1':'val1','key2':'val2'}
bar = foo['doesntexist'] or foo['key1']

我收到错误:

KeyError: 'doesntexist'

2 个答案:

答案 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'])