str='test'
example={'test':'value',}
return str in example and example[str] or None
为什么对str
中的密钥example
进行看似多余的额外测试?
答案 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