和短路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
请注意链接这些并在适用的情况下使用条件表达式。