2017-03-04 26 views
1

在Perl我可以做这样的事情:Python是否有像Perl一样的定义或运算符?

foo = a // b; 

什么我不知道是如果Python有类似这样的东西。我试过以下,但显然它不工作:

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

而我得到的错误:

KeyError: 'doesntexist' 
+3

该问题不是'或'它是'foo ['doesntexist']'引发错误。 –

回答

2

你不需要or可言:

bar = foo.get('doesntexist', foo['key1']) 
+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') 
相关问题