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_atr
是 None
。
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
引发错误。
我有一个属性 undefined_atr
,它是下面显示的 class Undefined
的一个实例。
class Undefined(object):
def __nonzero__(self):
raise ValueError()
undefined_atr = Undefined()
想法是使用这个 class 而不是 None
来确保 Python 将引发以下语句的异常而不是将 result
设置为 True
,如果 undefined_atr
是 None
。
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
引发错误。