和短路or
,参见布尔运算文档:and
表达式x and y
首先计算x
; 如果x
为假,则返回其值;否则,y
评估并返回结果值。
表达式x or y
首先计算x
; 如果x
为真,则返回其值;否则,y
评估并返回结果值。
请注意,and
仅y
当评估为 True 值时,才会评估 for 。x
相反,对于or
,y
仅在x
评估为 False 值时才评估。
对于第一个表达式True or blah
,这意味着它blah
永远不会被评估,因为第一部分已经是True
。
此外,您的自定义Blah
类被认为是 True:
在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为 false:False
、、None
所有类型的数字零,以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集)。所有其他值都被解释为 true。(有关__nonzero__()
更改此设置的方法,请参见特殊方法。)
由于您的类没有实现__nonzero__()
方法(也没有__len__
方法),因此就True
布尔表达式而言,它被认为是。
在表达式blah or blah.notexist
中,blah
因此为真,并且blah.notexist
从不计算。
经验丰富的开发人员经常有效地使用此功能,通常用于指定默认值:
some_setting = user_supplied_value or 'default literal'
object_test = is_it_defined and is_it_defined.some_attribute
请注意链接这些并在适用的情况下使用条件表达式。