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

时间:2015-11-19 21:38:12

标签: python exception undefined

我有一个属性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__

1 个答案:

答案 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引发错误。