Python和布尔运算中的未知对象

时间:2018-11-20 12:13:25

标签: python operator-overloading logical-operators

考虑这个Unknown类:

class Unknown:
    def __add__(self, other):
        return self
    def __radd__(self, other):
        return self

unknown = Unknown()
assert (unknown + 1) is unknown
assert (1 + unknown) is unknown

这也适用于__mul____rmul__

但是,对于布尔运算符,例如:

assert (unknown or True) is True
assert (unknown or False) is unknown

尝试--

def __or__(self, other):
    return self if not other else other

-或其他任何组合都不适合我。

请注意,我也无法定义__bool__(self),因为它的返回值既不是True也不是False,并且不允许返回NotImplemented

所以我的问题:是否可以覆盖orand运算符,以便它可能返回TrueFalse以外的其他内容?< / strong>


编辑:感谢下面的@CoryKramer@Martijn Peters评论。

我的印象是__or__用于逻辑or运算符。它不是。它是针对按位|的,实际上,没有任何方法可以覆盖逻辑or运算符。

1 个答案:

答案 0 :(得分:-1)

为什么不呢?你试过了吗?似乎工作正常……

class Unknown:
    def __add__(self, other):
        return self
    def __radd__(self, other):
        return self
    def __or__(self, other):
        return self

unknown = Unknown()
assert (unknown or unknown) is unknown