python有三种语言类型_python – 布尔值有两个可能的值 有三种可能的值类型?

在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:增加了将一个三态对象与另一个对比比较的支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值