Python是否有像Perl一样定义的或运算符?

4
在Perl中,我可以这样做:
foo = a // b;

我想知道Python是否有类似的功能。我尝试了以下代码,但显然它不起作用:
foo = {'key1':'val1','key2':'val2'}
bar = foo['doesntexist'] or foo['key1']

我遇到了一个错误:

KeyError: 'doesntexist'

3
问题不在于 or,而是因为 foo['doesntexist'] 抛出了一个错误。 - juanpa.arrivillaga
2个回答

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')

2
您根本不需要使用or
bar = foo.get('doesntexist', foo['key1'])

太好了,谢谢!这正是我在寻找的。 - Franz Kafka
这个回答略有不同于所问的问题 - get 方法在 foo = a // b 的情况下并没有帮助,它只能在 foo = a[x] if x in a else a[y] 的情况下发挥作用。 - Ken Williams
另一个问题是必须评估 foo['key1'] 是否必要。这不能处理 foo = cached // compute() 情况,而 // 是非常有用的。因此,我认为问题的正确答案实际上是“不,Python没有等效的运算符,您需要自己构建一个。” - Ken Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接