对于我的一个站点,我需要检查是否定义了几个类属性并且不是空的。到目前为止,我很高兴地使用了if self.attr:,在我看来,它是if self.attr is not None and self.attr is not '':的缩写,或者不管该属性的未定义的值是什么。
这可以很好地工作,但在检查多个字符串属性时会产生令人惊讶的行为。'' and ''不是False (正如我所料),而是''。
这就引出了一个问题:是否存在and操作符不强制类型转换为bool的其他类型?我想不出一个例子,这种行为上的差异会导致if-clause的实际结果不同(毕竟,''的计算结果仍然是False),但我有一种直觉,那就是边缘情况可能是一个陷阱。
最后,我很想知道有没有人知道为什么会这样实现?我认为Python的Zen只鼓励一种方式,而且+运算符似乎已经成为字符串连接的直观方式。
发布于 2012-08-07 20:49:19
and从不将类型转换为bool。相反,if对表达式的结果调用bool()。
使用and (以及or )的表达式在确定表达式不会根据第一个操作数计算为True或False时短路,并返回最后一个计算值:
>>> 0 and 'string'
0
>>> 1 and 'string'
'string'
>>> 'string' or 10
'string'
>>> '' or 10
10这种“副作用”经常用在python代码中。注意,not确实返回了一个布尔值。有关详细信息,请参阅python documentation on boolean operators。
文档还解释了什么构成各种类型的True或False等效项,例如None、0、''和空容器是False,而其他大多数内容都等同于True。
对于自定义类,您需要定义.__nonzero__() method (返回True或False)或.__len__() method (返回一个int,其中0是False,其他所有内容都是True)来影响它们的布尔值等效项,否则它们将始终缺省为True。
https://stackoverflow.com/questions/11846287
复制相似问题