布尔类型有两个可能的值。是否有三个可能值的类型?

26 浏览
0 Comments

布尔类型有两个可能的值。是否有三个可能值的类型?

这个问题已经有答案了:

可能是重复问题:

如何在Python中实现“枚举”类型?

我正在编写一个函数,理想情况下,我希望返回三种状态之一:“是”,“否”和“不知道”。

  1. 有没有编程语言有只有三个状态的类型?像布尔值一样,但是有三种状态而不是两种?
  2. 在不具有此类类型的语言(如Python)中,最好的类型表示是什么?

    目前我认为我将使用整数(0表示“否”,1表示“不知道”,2表示“是”),但也许还有更好的方法吗?整数似乎有点“魔法数字”。

    我可以返回TrueFalseNone,但是由于None在大多数比较上下文中将评估为False,因此它似乎会有一些错误。

admin 更改状态以发布 2023年5月22日
0
0 Comments

这被称为三值逻辑。正如其他答案所建议的那样,您可以实现一个类:

class Ternary:
    FALSE = 0
    TRUE = 1
    UNKNOWN = 2

就我个人而言,我可能会选择您的解决方案(TrueFalseNone),但我理解您的担忧。

0
0 Comments

在Python中,我会用一个包装对象来保存这三种值,分别是TrueFalseNone。由于具有三个可能值的类似布尔对象的隐式真值性是有问题的,所以我们将通过完全禁止它来解决这个问题(在__nonzero__()(在Python 3中是__bool__())中引发异常),从而要求比较始终是显式地使用in==!=。我们将等价性实现为标识,这样只有特定的单例值TrueFalseNone才会匹配。

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两个值与使用单个值的!=是相同的)。如果你想要能够执行这些对象的其他逻辑操作,你可以将其实现为方法,或者可能通过覆盖某些运算符来实现(不幸的是,逻辑notandor无法被覆盖,尽管有一个提案来添加它)。

还要注意,你无法在Python中覆盖id(),因此例如Tristate(None) is NoneFalse;这两个对象实际上是不同的。由于良好的Python风格是在与单例比较时使用is,这是不幸的,但不可避免的。

编辑4/27/16:添加了与另一个Tristate对象进行比较的支持。

0