首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串和and运算符:最佳实践,与+的区别

字符串和and运算符:最佳实践,与+的区别
EN

Stack Overflow用户
提问于 2012-08-07 20:43:14
回答 1查看 224关注 0票数 12

对于我的一个站点,我需要检查是否定义了几个类属性并且不是空的。到目前为止,我很高兴地使用了if self.attr:,在我看来,它是if self.attr is not None and self.attr is not '':的缩写,或者不管该属性的未定义的值是什么。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-07 20:49:19

and从不将类型转换为bool。相反,if对表达式的结果调用bool()

使用and (以及or )的表达式在确定表达式不会根据第一个操作数计算为True或False时短路,并返回最后一个计算值:

代码语言:javascript
复制
>>> 0 and 'string'
0
>>> 1 and 'string'
'string'
>>> 'string' or 10
'string'
>>> '' or 10
10

这种“副作用”经常用在python代码中。注意,not确实返回了一个布尔值。有关详细信息,请参阅python documentation on boolean operators

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

对于自定义类,您需要定义.__nonzero__() method (返回TrueFalse)或.__len__() method (返回一个int,其中0False,其他所有内容都是True)来影响它们的布尔值等效项,否则它们将始终缺省为True

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11846287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档