这个(冗余?)python表达式的含义是什么?

时间:2012-01-31 00:09:41

标签: python testing logic expression

str='test'
example={'test':'value',}
return str in example and example[str] or None

为什么对str中的密钥example进行看似多余的额外测试?

6 个答案:

答案 0 :(得分:6)

在这个具体的例子中,检查是首先确保'test'实际上是示例dict中的有效键,否则会得到KeyError异常。然后逻辑继续检查键并返回它,如果示例[str]的值变为False,则逻辑继续为None

如果这个例子只是这样做会更容易:

str='test'
example={'test':'value',}
return example.get(str, None) or None

<强>更新

更简单,因为不需要get()的额外参数:

return example.get(str) or None

更新2 :打破OP中的真值测试和布尔操作(基于评论)

example = {
    'test' : 'value', 
    'test2': 0, 
    'test3': [],
}
test = lambda k: k in example and example[k] or None
print test('test')
# value
print test('test2')
# None
print test('test3')
# None

答案 1 :(得分:3)

首先,对于查找不存在的键的情况,行为是不同的(额外的测试会阻止抛出KeyError异常)。

然而,它远不止于此,因为example[str]在布尔上下文中可能为false。例如,它可能是一个空字符串。

>>> str='test'
>>> example={'test':[],}
>>> str in example and example[str] or None
>>> str in example or None
True

所以这不是多余的。 str in example检查密钥是否存在,而and example[str]也检查值的真实性。

答案 2 :(得分:2)

由于Python懒惰地评估布尔,你可以在简单的测试中安全地省略括号。这可能使阅读更容易:

(str in example and example[str]) or None

用简单的英语:

“确保字典example具有密钥str,并且该密钥也具有非False值。如果是,则返回密钥example[str]的值。否则返回None

答案 3 :(得分:0)

str in example是一个布尔测试,用于查看str中的example是否为example[str],而{{1}}会产生与该键相关联的实际值。

答案 4 :(得分:0)

优雅的失败。如果该键不存在,则查找'example [str]'将在运行时失败。您将遇到问题,终止您的应用并获得追溯。通过首先检查密钥,您将获得“无”值,而您的应用程序将以其快乐的方式继续运行。

另一种更通用的方法是捕获异常并返回None作为结果。

def testfun():
    str='test2'
    example={'test':'value',}
    try:
        return example[str]
    except KeyError:
        return None

答案 5 :(得分:0)

如果该密钥不存在,则会获得KeyError exception

#!/usr/bin/python

str='test'
example={'test':'value',}

if str in example and example[str]:
    print example[str]
else:
    print False