在Python中,我会用包含这三个值的包装器对象来实现;我会使用True,False和None。由于具有三个可能值的布尔类对象的隐含真实值是有问题的,我们将通过不完全解释(__nonzero __()或Python 3,__bool __())中引发异常,因此需要比较总是明确地完成,使用==,或!=。我们将实现平等作为身份,使得只有具体的单例值True,False和None才匹配。
class Tristate(object):
def __init__(self, value=None):
if any(value is v for v in (True, False, None)):
self.value = value
else:
raise ValueError("Tristate value must be True, False, or None")
def __eq__(self, other):
return (self.value is other.value if isinstance(other, Tristate)
else self.value is other)
def __ne__(self, other):
return not self == other
def __nonzero__(self): # Python 3: __bool__()
raise TypeError("Tristate object may not be used as a Boolean")
def __str__(self):
return str(self.value)
def __repr__(self):
return "Tristate(%s)" % self.value
用法:
t = Tristate(True)
t == True # True
t != False # True
t in (True, False) # True
bool(t) # Exception!
if t: print "woo" # Exception!
当使用Tristate对象时,必须明确指定要匹配的值,即foo == True或bar!= None。您也可以在(False,None)中执行foo以匹配多个值(虽然当然两个值与!=相反,只有一个值)。如果还有其他的逻辑操作,你希望能够执行这些对象,你可以实现这些方法,或者可能通过覆盖某些操作符(可惜的是,但是,逻辑不是,和,或者是不可覆盖的,尽管有a proposal到添加)。
还要注意,你不能在Python中覆盖id(),所以例如。三态(无)为无虚假;两个对象其实是不同的。由于使用好的Python风格是与单身人士进行比较时,这是不幸的,但不可避免。
编辑4/27/16:增加了将一个三态对象与另一个对比比较的支持。