__cmp__ के बजाय __lt__

| | | | | | |

पायथन 2.x में तुलना ऑपरेटरों को अधिभारित करने के दो तरीके हैं, __cmp__ या "रिच तुलना ऑपरेटर" जैसे <कोड>__lt__. रिच तुलना ओवरलोड को प्राथमिकता दी जाती है, लेकिन ऐसा क्यों है?

रिच तुलना ऑपरेटर प्रत्येक को लागू करने के लिए आसान होते हैं, लेकिन आपको उनमें से कई को लगभग समान तर्क के साथ लागू करना होगा . हालांकि, यदि आप बिल्टिन cmp और टपल ऑर्डरिंग का उपयोग कर सकते हैं, तो __cmp__ काफी सरल हो जाता है और सभी तुलनाओं को पूरा करता है:

कक्षा ए (वस्तु): def __init__ (स्वयं, नाम, आयु, अन्य): स्वयं नाम = नाम स्वयं। उदाहरण वापसी cmp((self.name, self.age, self.other), (other.name, other.age, other.other)) 

यह सरलता मेरी जरूरतों को पूरा करती है समृद्ध तुलनाओं के सभी 6 (!) को ओवरलोड करने से कहीं बेहतर है। (हालांकि, आप इसे "सिर्फ" 4 तक ले जा सकते हैं यदि आप "स्वैप्ड तर्क"/प्रतिबिंबित व्यवहार पर भरोसा करते हैं, लेकिन इसके परिणामस्वरूप मेरी विनम्र राय में जटिलता में वृद्धि होती है।)

< मजबूत>क्या कोई अप्रत्याशित नुकसान है जिसके बारे में मुझे अवगत कराने की आवश्यकता है यदि मैं केवल __cmp__ को ओवरलोड करता हूं?

मैं < को समझता हूं , <=, ==, आदि ऑपरेटरों को अन्य उद्देश्यों के लिए अतिभारित किया जा सकता है, और वे अपनी पसंद की कोई भी वस्तु वापस कर सकते हैं। मैं उस दृष्टिकोण के गुणों के बारे में नहीं पूछ रहा हूं, लेकिन केवल अंतर के बारे में जब इन ऑपरेटरों का उपयोग उसी अर्थ में तुलना के लिए किया जाता है, जिसका अर्थ है कि वे संख्याओं के लिए हैं।

अपडेट: क्रिस्टोफर के रूप में बताया गया, cmp गायब हो रहा है 3.x में क्या कोई विकल्प है जो कार्यान्वयन तुलनाओं को उपरोक्त __cmp__ जितना आसान बना देता है?