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

与None并行的问题存在于false=0,true=1,unknown=2(unknown实际上也不是真的,但是如果不小心的话,它将被求值为true)。

我想出了一个老套的办法,至少能得到你想要的东西,我想。它至少可以为您提供在if/else和其他布尔求值实例中以三元方式求值的东西。class Yes(object):

def __nonzero__(self):

return True

class No(object):

def __nonzero__(self):

return False

class Unknown(object):

def __nonzero__(self):

raise ValueError('Unknown typed values do not evaluate to True/False. Try using Ternary.eval().')

class Ternary(object):

def __init__(self, yes, no, unknown):

setattr(self, yes, Yes())

setattr(self, no, No())

setattr(self, unknown, Unknown())

@staticmethod

def eval(value, unknown_eval):

if isinstance(value, Unknown):

return unknown_eval

return bool(value)

用法:t = Ternary('yes', 'no', 'unknown')

# Do stuff to assign ternary value to x

if Ternary.eval(x, True):

print 'x is yes or unknown'

if Ternary.eval(x, False):

print 'x is yes only'

你可以做Yes,No,和未知的伪单子,这可以让你稍微改进eval。当你知道你的值将是yes或no时,你仍然可以进行简单的if检查,但是如果你试图在Unknown上直接执行bool()(即if x),你将得到一个TypeError。这将使您的代码更加明确,因为每次您检查三元类型的值时,您都必须在代码中定义您希望在该条件的上下文中如何处理未知,所以这是一个优点。

编辑:

我想到了另一种方法,这种方法不需要特别的处理,但不太灵活。上翻:class Unknown(object):

def __init__(self, eval):

self._eval = eval

def __nonzero__(self):

return self._eval

class Ternary(object):

def __init__(self, yes, no, unknown, unknown_eval):

setattr(self, yes, Yes())

setattr(self, no, No())

setattr(self, unknown, Unknown(unknown_eval))

用法:t1 = Ternary('yes', 'no', 'unknown', True)

t2 = Ternary('yes', 'no', 'unknown', False)

# Do stuff to assign ternary values to x1 and x2

if x1:

print 'x is yes or unknown'

if x2:

print 'x is yes only'

这样做的好处是允许nonzero在Unknown中作为spec调用工作,但它的缺点是从实例化开始就设置了Unknown的eval,并且不再允许Unknown成为伪单例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值