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

保罗·维特(Paul D. Waite):

可能重复:
在Python中实现“枚举”的最佳方法是什么?

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

  1. 是否有任何一种编程语言都具有只有三个状态的类型?像布尔值一样,但是具有三个状态而不是两个状态?

  2. 在没有这种类型的语言中(例如Python),代表这种类型的最佳类型是什么?

    目前,我想我会使用一个整数(0表示“否”,1“不知道”和2“是”),但是也许有更好的方法吗?整数似乎有点“不可思议的数字”。

    我可以返回TrueFalse或者None,而是None将评估为False大多数比较语境中,它似乎是错误有点成熟。

kindall:

在Python中,我将使用包含这三个值之一的包装器对象来实现;我会使用TrueFalseNone由于具有三个可能值的类布尔对象的隐式真实性值存在问题,因此我们将通过完全禁止(在__nonzero__()或Python 3中引发异常)来解决此问题__bool__(),从而要求始终使用in==!=所以只有特定的单值,我们将实现平等的身份TrueFalse以及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两个值!=与单个值相反)。如果有其他的逻辑运算,你希望能够与这些对象进行,你可以为方法,或者可能通过重写某些运营商(实现这些可悲的是,然而,逻辑notandor不覆写投放,但有一个建议,以添加)。

另外请注意,您不能id()在Python中覆盖,例如Tristate(None) is Noneis False这两个对象实际上是不同的。由于is在与单例进行比较时会使用良好的Python样式,因此这是不幸的,但不可避免。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有一个具有不同值的数据类型,例如布尔值

是否有一个具有不同值的数据类型,例如布尔值

如何检查两个布尔值是否相等?

具有两个可能的类型的验证值

合并两个相同类型的表达式(不带布尔值)

Matlab-创建两个考虑两个对象所有可能值的数组

连续检查两个True(布尔值1)值的最快和/或最有效的方法是什么?

检查三个布尔中是否有两个是正确的?

jQuery选择器有两个可能的值

Python说我只有两个值,需要三个,而已经有三个值

如何将三个具有多个值的表联接到另外两个表上

为什么我得到两个不同的结果?(带有布尔值的问题)

为什么我在React Native中对此布尔值有两个不同的值?

只有两个可能值的Swift数组

张量的布尔值具有不止一个值是不明确的

当两个索引存在并排序时返回布尔值的函数?

如何检查2D数组是否连续具有三个相同的值

发送带有ajax和setTimeout()的两个布尔值的问题

基于第三个数据框中匹配值的具有新布尔值列的两个数据框的乘积

Visual Basic 2012:我想要类似布尔值的东西,但是有三个可能的答案?

如何通过可能具有浮点值且没有适当的等号的成员比较两个对象?

SQL,仅合并两个具有不同值的表(仅基于三个字段,而非整个行)

Javascript:比较三个布尔值并返回所有真实布尔值

使用两个表计算带有布尔值的列的百分比

是否可以使用具有两个以上可能值的位图索引?

两个布尔值列表上的逻辑或

比较两个具有不同 int 值的布尔值

如何在考虑第三个因素的同时删除在两个非主键列中具有相同值的记录?

我如何使用 & 添加两个布尔值?