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



