параллельный к Отсутствуют задачи существует с ложным = 0, = 1 верно, неизвестно = 2 (неизвестное на самом деле не истинно, но будет иметь значение True, если вы не будете осторожны).
Я придумал хакерский способ получить то, что по крайней мере приближается к тому, что вы хотите, я думаю. По крайней мере, вы получите что-то, что будет оцениваться триниально в if/else и других булевых вариантах eval.
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'
Вы могли бы сделать Да, Нет, и не указан псевдо-одиночек, которые позволили бы вы уточнить Eval немного. Вы все равно можете сделать простые, если вы проверите, когда знаете, что ваше значение будет да или нет, но если вы попытаетесь сделать прямое bool() (т.е. если x) в Unknown, вы получите TypeError. Это сделало бы ваш код более явным, так как каждый раз, когда вы проверяли значение типа trinary, вам нужно было бы определить в своем коде, как вы хотите, чтобы неизвестный обрабатывался в контексте этого условного, так что это было бы плюсом ,
Редактировать: Я подумал об альтернативе, которая потребует меньше специальной обработки, но менее гибкой. Alter выше таким образом:
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'
Это имеет преимущество позволяет ненулевым работать спецификации вызовов для в Unknown, но она имеет обратную сторону, имеющий Eval для неизвестного набора в камне от инстанцирования и больше не позволяя Неизвестному быть псевдо-одиночным.
Это может быть актуально: http://stackoverflow.com/questions/36932/whats-the-best-way-to-implement-an-enum-in-python – Owen
Как и по этому вопросу, не так ли? http://stackoverflow.com/questions/36932/whats-the-best-way-to-implement-an-enum-in-python –
@ JohannesWeiß: вполне возможно - у меня нет фона C, m не знакомы с концепцией перечислений. Выглядит хорошо, ура. –