2012-08-07 9 views
5

निम्नलिखित कोड को पूरा करने का सबसे प्राकृतिक तरीका क्या है?तुलना ऑपरेटरों को लागू करते समय मिश्रित प्रकारों को कैसे संभालें?

import functools 

@functools.total_ordering 
class X: 
    def __init__(self, a): 
     self._a = a 

    def __eq__(self, other): 
     if not isinstance(other, X): 
      return False 
     return self._a == other._a 

    def __lt__(self, other): 
     if not isinstance(other, X): 
      return ...     // what should go here? 
     return self._a < other._a 

if __name__ == '__main__': 
    s = [2, 'foo', X(2)] 
    s.sort() 
    print s 

उत्तर

2

आप जो कुछ भी प्राकृतिक महसूस करते हैं उसे चुन सकते हैं; False का अर्थ है कि आपके उदाहरण हमेशा अन्य प्रकारों, True के बाद सॉर्ट करते हैं और उन्हें पहले सॉर्ट किया जाएगा।

वैकल्पिक रूप से, आप NotImplemented लौट सकते हैं (the __lt__ and other comparison methods documentation देखें) संकेत करने के लिए तुलना समर्थित नहीं है:

def __lt__(self, other): 
    if not isinstance(other, X): 
     return NotImplemented 
    return self._a < other._a 

प्रलेखन का हवाला देते हुए:

एक अमीर तुलना विधि सिंगलटन NotImplemented वापस आ सकते हैं अगर यह तर्कों की एक दी गई जोड़ी के लिए ऑपरेशन को लागू नहीं करता है। सम्मेलन से, False और True सफल तुलना के लिए वापस आ गए हैं। हालांकि, ये विधियां किसी भी मूल्य को वापस कर सकती हैं, इसलिए यदि तुलना ऑपरेटर को बूलियन संदर्भ में उपयोग किया जाता है (उदाहरण के लिए, यदि एक कथन की स्थिति में), तो पाइथन bool() को यह निर्धारित करने के लिए कॉल करेगा कि परिणाम सही है या गलत है या नहीं।

+1

बस झूठी या सही लौटना एक अच्छा विचार नहीं है। इस मामले पर विचार करें जब आपके पास एक और समान वर्ग वाई है और एक्स ('foo') <वाई ('बार') और वाई ('बार')> एक्स ('foo') है। परिणाम सुसंगत नहीं हो सकते हैं। – user763305

+1

लेकिन वापस नहीं आया कार्यान्वित काम करता है। फिर पायथन अपने स्वयं के डिफ़ॉल्ट क्रम का उपयोग करेगा जो कि कुछ हद तक मनमानी लेकिन सुसंगत है। – user763305

4

मेरा व्यक्तिगत दृष्टिकोण:

एक अपवाद।

विभिन्न प्रकारों के बीच कोई प्राकृतिक आदेश नहीं है।

अधिकारी एक: (यह एक चुनते हैं, तो वहाँ होना चाहिए)

हालांकि मैं उस के साथ सहमत नहीं हूँ पूरी तरह से, मैनुअल स्पष्ट रूप से यह कैसे किया जाना चाहिए:

http://docs.python.org/library/stdtypes.html#comparisons

अलग-अलग प्रकार के ऑब्जेक्ट्स, अलग-अलग संख्यात्मक प्रकारों और अलग-अलग स्ट्रिंग प्रकारों को छोड़कर, बराबर तुलना कभी नहीं; ऐसी वस्तुओं को क्रमशः लेकिन मनमाने ढंग से आदेश दिया जाता है (ताकि एक विषम सरणी को क्रमबद्ध करने से लगातार परिणाम मिल सके)। इसके अलावा, कुछ प्रकार (उदाहरण के लिए, फ़ाइल ऑब्जेक्ट्स) तुलना की केवल एक अपमानजनक धारणा का समर्थन करते हैं जहां उस प्रकार की दो वस्तुएं असमान हैं। दोबारा, ऐसी वस्तुओं को मनमाने ढंग से लेकिन लगातार जारी किया जाता है। <, < =,> और> = ऑपरेटर एक टाइपरर अपवाद उठाएंगे जब कोई ऑपरेंड जटिल संख्या हो।

तो मूल रूप से ... मैं एक अपवाद उठाउंगा, लेकिन ऑर्डर करने का सबसे पायथन तरीका मैनुअल का अनुपालन करना होगा।

एक होना चाहिए - और अधिमानतः इसे करने का केवल एक ही तरीका है।

+0

लेकिन पायथन इस तरह के आदेश को लागू करता है। मैं सूची [2.3, 'foo', int] को सॉर्ट कर सकता हूं। – user763305

+0

'1> 'एक स्ट्रिंग' गलत है,' 1 <'एक स्ट्रिंग' सत्य है। –

+0

विशेष रूप से, 'TypeError ("{} से {}" की तुलना नहीं कर सकता। प्रारूप (प्रकार (स्वयं), प्रकार (अन्य))'। – ecatmur

संबंधित मुद्दे