Python:为多个条件语句中的实例覆盖 __nonzero__

Python: overriding __nonzero__ for instances in multiple condition statements

我有一个属性 undefined_atr,它是下面显示的 class Undefined 的一个实例。

class Undefined(object):
    def __nonzero__(self):
       raise ValueError()

undefined_atr = Undefined()

想法是使用这个 class 而不是 None 来确保 Python 将引发以下语句的异常而不是将 result 设置为 True,如果 undefined_atrNone

result = not undefined_atr

一切正常,但如果我有一个像下面这样的多条件语句,除非 undefined_atr 是第一个操作数,否则不会引发异常。

result = True and undefined_atr # Does not raise exception
result = undefined_atr and True # Raises exception

知道为什么 Python 在第一种情况下不使用我的 __nonzero__ 版本吗?是否可以强制使用?

请注意,以下内容确实会产生异常,因此由于某种原因 'not' 导致调用覆盖的 __nonzero__

result = True and not undefined_atr # Raises exception

x and y 实际上并没有尝试将 y 解释为布尔值。相当于

y if x else x

除了 x 只计算一次。同样,x or y 等价于

x if x else y

没有 undefined_atr 的值会导致 True and undefined_atr 引发错误。