对于我的一个站点,我需要检查是否定义了多个类属性而不是空.到目前为止,我很高兴使用if self.attr:
,在我看来是简写if self.attr is not None and self.attr is not '':
,或者属性的未定义值.
这样可以正常工作,但在检查多个字符串属性时会产生令人惊讶的行为.'' and ''
不是False
(正如我所料),但是''
.
这引出了一个问题:and
运营商是否还有其他类型强制进行类型转换bool
?我不能想出一个例子,这种行为上的差异会导致if
-clause 的实际不同结果(毕竟,''
仍然评估False
),但是我觉得有可能是陷阱的边缘情况.
最后,我想知道是否有人知道为什么这样实施?我认为Python的Zen只鼓励单向和单向,并且+
运算符似乎已经用于字符串连接的直观方式.
Mar*_*ers 13
and
从来没有说过bool.相反,if
调用bool()
表达式的结果.
使用and
(和or
,就此而言)短路的表达式,当它可以确定表达式不会根据第一个操作数计算为True或False,并返回最后一个计算值:
>>> 0 and 'string'
0
>>> 1 and 'string'
'string'
>>> 'string' or 10
'string'
>>> '' or 10
10
Run Code Online (Sandbox Code Playgroud)
这种"副作用"通常用在python代码中.请注意,not
它确实返回一个布尔值.有关详细信息,请参阅有关布尔运算符的python文档.
该文档还解释了什么是True
或False
相当于各种类型,比如None
,0
,''
和空箱是False
,虽然大多数其他一切等同于True
.
对于自定义类,您需要定义.__nonzero__()
方法(返回True
或False
)或.__len__()
方法(返回int,where 0
is False
和其他所有内容True
),以影响它们的布尔等价物,否则它们将始终默认为True
.
归档时间: |
|
查看次数: |
222 次 |
最近记录: |