python - 字符串和 and 运算符 : best practice, 与 + 的区别

标签 python

对于我的一个站点,我需要检查几个类属性是否已定义且不为空。到目前为止,我很高兴地使用了 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了解详情。

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

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

关于python - 字符串和 and 运算符 : best practice, 与 + 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11846287/

相关文章:

python - Python中的自定义异常似乎不遵循 "its easier to ask for forgiveness"?

python - 对 .dat 文件的两列进行一些数学计算并将结果保存到第三列

python - 狮身人面像 : force rebuild of html, 包括 autodoc

Python:如何为字典分配一个长度不同的列表的值?

python - 使用 Makefile、Docker 和 Python 部署到 heroku

python - 如果笔记本电脑屏幕关闭,通过 printwindow 获取屏幕截图不会重绘

python - Google App Engine 为音频元素提供 MP3 服务需要内容范围 header

python - 将特定字符串值映射到 matplotlib.pyplot.imshow() 中的特定颜色

python - python 3.9 上的 Typing.Optional 是否有更新,或者我做错了什么?

python - 如何更改GML文件中节点的id值