对于我的一个站点,我需要检查几个类属性是否已定义且不为空。到目前为止,我很高兴地使用了 if self.attr:
,在我看来它是 if self.attr is not None and self.attr is not '':
,或者属性的任何未定义值。
这工作正常,但在检查多个字符串属性时会产生令人惊讶的行为。 '' and ''
不是 False
(如我所料),而是 ''
。
这引出了一个问题:and
运算符不会强制将类型转换为 bool
的其他类型吗?
我想不出一个例子,说明这种行为差异会导致 if
子句产生实际不同的结果(毕竟,''
仍然计算为 False
),但我的直觉是存在可能是陷阱的边缘情况。
最后,我很想知道是否有人知道为什么要这样实现?我认为 Python 之禅只鼓励一种方式,+
运算符似乎已经成为字符串连接的直观方式。
最佳答案
and
从不类型转换为 bool。相反,if
在表达式的结果上调用 bool()
。
使用 and
(和 or
,就此而言)的表达式,当它可以确定表达式不会根据第一个操作数,并返回最后评估的值:
>>> 0 and 'string'
0
>>> 1 and 'string'
'string'
>>> 'string' or 10
'string'
>>> '' or 10
10
这种“副作用”经常用在 python 代码中。请注意,不
确实 返回一个 bool 值。查看python documentation on boolean operators了解详情。
该文档还解释了什么构成了各种类型的 True
或 False
等价物,例如 None
、0
、''
和空容器为 False
,而大多数其他内容等同于 True
。
对于自定义类,您需要定义 .__nonzero__()
method (返回 True
或 False
)或 .__len__()
method (返回一个 int,其中 0
为 False
,其他一切为 True
),以影响它们的 bool 值等价物,否则它们将始终默认为正确
。
关于python - 字符串和 and 运算符 : best practice, 与 + 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11846287/