2012-01-10 8 views
20

मान लीजिए कि मेरे क्लासए के उदाहरण डेटा संरचना में समाप्त हो जाएंगे और हम जानते हैं कि क्रमबद्ध() को कॉल किया जाएगा। यह किसी और का कोड है जो सॉर्ट किया जाएगा() ताकि मैं एक सॉर्टिंग फ़ंक्शन निर्दिष्ट नहीं कर सकता लेकिन मैं क्लास पर जो भी विधियां उचित कर सकता हूं उसे लागू कर सकता हूं।क्या यह कक्षा के लिए __lt__ को लागू करने के लिए सुरक्षित है जिसे सॉर्ट किया जाएगा?

यह मेरे लिए प्रतीत होता है कि

def __lt__(self, other): 

के लिए पर्याप्त है और मैं अन्य पांच या तो तरीकों (क्यूटी, eq, ले, जीई, ne) को लागू की जरूरत नहीं है कि।

क्या यह पर्याप्त है?

उत्तर

27

PEP 8 इस अभ्यास के खिलाफ अनुशंसा करता है। इसके बजाय,

functools.total_ordering वर्ग डेकोरेटर उपयोग करने पर विचार काम करने के लिए: मैं भी इसके खिलाफ सलाह देते हैं क्योंकि यह (लघु कोड संशोधन के खिलाफ मजबूत नहीं) एक नाजुक प्रोग्रामिंग शैली है

@total_ordering 
class Student: 
    def __eq__(self, other): 
     return ((self.lastname.lower(), self.firstname.lower()) == 
       (other.lastname.lower(), other.firstname.lower())) 
    def __lt__(self, other): 
     return ((self.lastname.lower(), self.firstname.lower()) < 
       (other.lastname.lower(), other.firstname.lower())) 
+0

धन्यवाद, यह एकदम सही है! –

+1

पायथन का सॉर्ट * केवल रिकॉर्ड के लिए केवल '__lt __() 'का उपयोग करने के रूप में प्रलेखित है, लेकिन भविष्य-प्रमाणन अच्छा है। मुझे इस बारे में पता नहीं था! – kindall

+1

@kindall क्या आप इसे मेरे सॉर्टिंग से कैसे मार्गदर्शित करते हैं? कृपया एक लिंक प्रदान करें ताकि मैं स्पष्ट रूप से दस्तावेज़ों को संपादित कर सकूं जो \ _ \ _ lt \ _ \ _ पर भरोसा करते हैं। –

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

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