这个(多余?)Python表达式是什么意思?

3 投票
6 回答
841 浏览
提问于 2025-04-17 11:59
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

撰写回答