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

  显示原文与译文双语对照的内容
0 0

对于我的一个网站,我需要检查几个类属性是否被定义而不是空的。 到现在为止我都很乐意使用 if self.attr:,这在我看来是简写 if self.attr is not None and self.attr is not '':,和其它未定义的属性的值。

它也能正常工作,但实现以令人惊讶的方式选中多个字符串的属性。 '' and ''False( 按照所期望的),但是 ''.

这就产生了一个问题: 是否存在着其他类型为其 and运算符不强制转换为类型 bool? 我不能想出一个例子,其中该行为会导致实际的不同而产生不同的结果 if子句( 毕竟, ''仍求值为 False),但现在只剩下的直觉有可能有危险的边缘情况。

最后,我想我会非常希望知道是否有人知道为什么是这样实现的? 我还以为只能Python Zen的鼓励的一种方式,另一个方向,而 +运营商已经为字符串连接似乎是最直观的方式。

时间:原作者:4个回答

0 0

and从不typecasts为bool 。 更确切地说, if调用 bool()在表达式的结果。

一个是x 只计算一次 and( 和 or,在这个问题上),它可以决定时短路表达式不会计算为True或False基于第一个操作数,并返回最后一个评估值:

>>> 0 and 'string'
0
>>> 1 and 'string'
'string'
>>> 'string' or 10
'string'
>>> '' or 10
10

这个'副作用'通常用在python代码中。 请注意, not" 返回一个布尔值。 对布尔运算符请参阅 python文档获得详细的信息

文档也解释了在何种情况下会构成 TrueFalse各种类型的等效项,如 None, 0, ''容器被倒空, False,而大多数的其他所有内容都与 True.

对于自定义的类,需要定义.__nonzero__()方法 ( 返回 TrueFalse) 或.__len__()方法 ( 返回的int值,其中 0False而其它的问题是 True),以影响他们的逻辑等价的,否则它们将始终默认为 True.

原作者:
...