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成為偽單例。
總結
以上是生活随笔為你收集整理的python布尔类型的两个值_布尔人有两个可能的值。是否有三种可能值的类型?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java第五周总结
- 下一篇: 3ds Max 布尔(Boolean)运