布尔类型有两个可能的值。是否有三个可能值的类型?
布尔类型有两个可能的值。是否有三个可能值的类型?
这个问题已经有答案了:
可能是重复问题:
我正在编写一个函数,理想情况下,我希望返回三种状态之一:“是”,“否”和“不知道”。
- 有没有编程语言有只有三个状态的类型?像布尔值一样,但是有三种状态而不是两种?
- 在不具有此类类型的语言(如Python)中,最好的类型表示是什么?
目前我认为我将使用整数(
0
表示“否”,1
表示“不知道”,2
表示“是”),但也许还有更好的方法吗?整数似乎有点“魔法数字”。我可以返回
True
,False
或None
,但是由于None
在大多数比较上下文中将评估为False
,因此它似乎会有一些错误。
这被称为三值逻辑。正如其他答案所建议的那样,您可以实现一个类:
class Ternary: FALSE = 0 TRUE = 1 UNKNOWN = 2
就我个人而言,我可能会选择您的解决方案(True
、False
、None
),但我理解您的担忧。
在Python中,我会用一个包装对象来保存这三种值,分别是True
、False
和None
。由于具有三个可能值的类似布尔对象的隐式真值性是有问题的,所以我们将通过完全禁止它来解决这个问题(在__nonzero__()
(在Python 3中是__bool__()
)中引发异常),从而要求比较始终是显式地使用in
、==
或!=
。我们将等价性实现为标识,这样只有特定的单例值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 or bar!=None
。你也可以foo in (False, None)
来匹配多个值(尽管当然,in
两个值与使用单个值的!=
是相同的)。如果你想要能够执行这些对象的其他逻辑操作,你可以将其实现为方法,或者可能通过覆盖某些运算符来实现(不幸的是,逻辑not
、and
和or
无法被覆盖,尽管有一个提案来添加它)。
还要注意,你无法在Python中覆盖id()
,因此例如Tristate(None) is None
为False
;这两个对象实际上是不同的。由于良好的Python风格是在与单例比较时使用is
,这是不幸的,但不可避免的。
编辑4/27/16:添加了与另一个Tristate
对象进行比较的支持。