【问题标题】:Strings and the and operator: best practice, differences with +字符串和 and 运算符:最佳实践,与 + 的区别
【发布时间】:2012-08-04 11:41:12
【问题描述】:

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

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

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

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

【问题讨论】:

标签: python


【解决方案1】:

and 从不转换为 bool。相反,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'' 和空容器为 False,而大多数其他内容都等效于True.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2010-11-10
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多