考虑以下类定义:
class Symbolic(object):
def __eq__(self, rhs):
return Symbolic()
def __le__(self, rhs):
return Symbolic()
def __gt__(self, rhs):
return Symbolic()
def __contains__(self, other):
return Symbolic()
类上定义的操作行为如下:
x = Symbolic()
y = Symbolic()
x == y --> <Symbolic object at ...>
x <= y --> <Symbolic object at ...>
x > y --> <Symbolic object at ...>
y in x --> True # huh?
根据标题,我的问题是:为什么 Python 运行时将运算符的输出显式强制为布尔类型,而不是其他预期返回布尔值( 、、、等)in
的比较运算符的输出?==
<=
>
编辑:文档分别对in
运算符和丰富的比较进行了以下说明:
对于定义
__contains__()
方法的用户定义类,x in y
当且仅当y.__contains__(x)
为真时为真。按照惯例,成功比较返回 False 和 True。但是,这些方法可以返回任何值,因此如果在布尔上下文中使用比较运算符(例如,在 if 语句的条件中),Python 将对值调用 bool() 来确定结果是真还是假.
问题仍然存在:为什么需要区分?