我有一个属性undefined_atr
,它是下面显示的类Undefined
的一个实例。
class Undefined(object):
def __nonzero__(self):
raise ValueError()
undefined_atr = Undefined()
我们的想法是使用此类而不是None
来确保Python会为以下语句引发异常,而不是将result
设置为True
,如果{{ {1}}是undefined_atr
。
None
这一切都很好,但如果我有一个类似下面的多条件语句,除非result = not undefined_atr
是第一个操作数,否则不会引发异常。
undefined_atr
为什么Python在第一种情况下不使用我的result = True and undefined_atr # Does not raise exception
result = undefined_atr and True # Raises exception
版本以及是否可以强制使用?
请注意,以下操作会产生异常,因此出于某种原因,“not”会导致被覆盖的__nonzero__
被调用。
__nonzero__
答案 0 :(得分:1)
x and y
实际上并没有尝试将y
解释为布尔值。它相当于
y if x else x
除了x
仅评估一次。同样,x or y
相当于
x if x else y
undefined_atr
的任何值都不会导致True and undefined_atr
引发错误。