字符串和运算符:最佳实践,与+的差异

时间:2012-08-07 12:43:14

标签: python

对于我的一个网站,我需要检查是否定义了多个类属性而不是空。到目前为止,我很高兴使用if self.attr:,在我看来是if self.attr is not None and self.attr is not '':的简写,或者属性的未定义值。

这样可以正常工作,但在检查多个字符串属性时会产生令人惊讶的行为。 '' and ''不是False(正如我所料),而是''

这引出了一个问题:and运算符是否有其他类型强制转换为bool的类型转换? 我不能想出一个例子,这种行为上的差异会导致if - 子句的实际不同结果(毕竟,''仍然评估为False),但我是留下了直觉,可能是陷阱的边缘情况。

最后,我很想知道是否有人知道为什么会这样实施?我认为Python的Zen只鼓励单向和单向,而+运算符似乎已经成为字符串连接的直观方式。

1 个答案:

答案 0 :(得分:13)

and从不对thol进行类型转换。相反,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

该文档还解释了各种类型的TrueFalse等效内容的构成,例如None0''和空容器{ {1}},而其他大多数内容都等同于False

对于自定义类,您需要定义.__nonzero__() method(返回TrueTrue)或.__len__() method(返回int,其中False0以及其他所有内容False),以影响其布尔值等效,否则它们将始终默认为True