कोई भी समस्या के समानांतर झूठी = 0, सच के साथ मौजूद है = 1, अज्ञात = 2 (अज्ञात है वास्तव में सच भी नहीं है, लेकिन यदि आप सावधान नहीं हैं तो सच साबित होंगे)।
मैं एक hackish तरीका कुछ कम से कम का अनुमान लगाती है कि आप क्या चाहते हैं, मुझे लगता है कि प्राप्त करने के लिए के साथ आया था। यह कम से कम आपको कुछ ऐसा मिलेगा जो एक ट्रिनरी फैशन में मूल्यांकन करेगा यदि/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 एक छोटा सा परिशोधित कर सकते हैं होगा। यदि आप जानते हैं कि आपका मान हाँ या नहीं होने पर जांचता है तो आप अभी भी सरल कर सकते हैं, लेकिन यदि आपने अज्ञात पर सीधे बूल() यानी x) करने का प्रयास किया है तो आपको टाइप एरर मिल जाएगा। यह आपके कोड अधिक स्पष्ट हो जाएगा हालांकि, हर बार जब आप trinary प्रकार के एक मूल्य की जाँच के रूप में, आप अपने कोड में परिभाषित करने के लिए कैसे आप अज्ञात है कि सशर्त के संदर्भ में इलाज किया जा करना चाहता था होगा, ताकि एक प्लस होगा ।
संपादित करें: मैं एक विकल्प है कि कम विशेष हैंडलिंग लेकिन कम सुविधाजनक की आवश्यकता होगी के बारे में सोचा। thusly ऊपर बदलें:
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'
यह अज्ञात में के लिए कल्पना के रूप में कॉल काम करने के लिए अनुमति देता है अशून्य को लाभ मिलता है, लेकिन यह पत्थर में अज्ञात सेट के लिए 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 –
@ जोहान्सवेस: काफी संभवतः - मेरे पास सी पृष्ठभूमि नहीं है, और मैं ' मैं enums की अवधारणा से परिचित नहीं हूँ। अच्छा लगता है, चीयर्स। –