这个(多余?)Python表达式是什么意思?
str='test'
example={'test':'value',}
return str in example and example[str] or None
为什么在example
中对键str
进行看起来多余的额外测试呢?
6 个回答
2
因为Python在处理布尔值时是懒惰求值的,所以在简单的条件判断中,你可以放心地省略括号。这样可能会让代码更容易阅读:
(str in example and example[str]) or None
用简单的语言来说:
“确保字典example
里有一个键str
,并且这个键的值不是假值。如果满足这些条件,就返回这个键example[str]
的值。否则就返回None
。”
3
首先,当你查找一个不存在的键时,行为是不同的(额外的测试可以防止出现 KeyError
错误)。
不过,这个问题更复杂,因为 example[str]
在布尔上下文中可能是假的。例如,它可能是一个空字符串。
>>> str='test'
>>> example={'test':[],}
>>> str in example and example[str] or None
>>> str in example or None
True
所以这并不是完全多余。str in example
是用来检查这个键是否存在,而 and example[str]
则是用来检查这个值是否为真。
6
在这个具体的例子中,首先要检查一下'test'这个键在示例字典中是否真的存在,否则你会遇到一个叫做KeyError的错误。接下来,程序会继续检查这个键,如果找到了就返回它的值,如果没有找到或者值是假的,就返回None。
如果这个例子直接这样做就简单多了:
str='test'
example={'test':'value',}
return example.get(str, None) or None
更新
其实更简单,因为get()这个方法的额外参数并不需要:
return example.get(str) or None
更新2:根据评论,来详细分析一下原作者的真值测试和布尔操作。
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