2013-04-26 6 views
9

पायथन 3 में, functools.total_ordering decorator सभी 6 तुलना ऑपरेटर प्राप्त करने के लिए केवल __lt__ और __eq__ को अधिभारित करने की अनुमति देता है।पायथन कुल_ऑर्डिंग: क्यों __lt__ और __eq__ __le__ के बजाय?

मैं नहीं मिलता है क्यों एक से दो ऑपरेटरों लिखने के लिए जब एक, पर्याप्त होगा अर्थात् __le__ या __ge__, है और अन्य सभी तदनुसार परिभाषित किया जाएगा:

a < b <=> not (b <= a) 
a > b <=> not (a <= b) 
a == b <=> (a <= b) and (b <= a) 
a != b <=> (a <= b) xor (b <= a) 

है सिर्फ इसलिए कि XOR ऑपरेटर नहीं है कि मूल रूप से मौजूद है?

+2

'xor' मूल रूप से मौजूद है। –

+0

@MartijnPieters केवल bitwise xor, है ना? –

उत्तर

13

प्रलेखन राज्यों आप __lt__() में से एक, __le__(), __gt__(), या __ge__(), को परिभाषित करना होगा, लेकिन केवल एक __eq__() विधि की आपूर्ति चाहिए।

दूसरे शब्दों में, __eq__ विधि वैकल्पिक है।

total_ordering implementation आपको __eq__ विधि निर्दिष्ट करने की आवश्यकता नहीं है; यह केवल __lt__(), __le__(), __gt__(), या __ge__() विधियों के लिए परीक्षण करता है। यह उन 4 में से एक के आधार पर 3 गायब विशेष तरीकों की आपूर्ति करता है।

__eq__ विधि वैकल्पिक है क्योंकि आधार object ऑब्जेक्ट आपके लिए एक परिभाषित करता है; दो उदाहरणों को केवल तभी माना जाता है जब वे एक ही वस्तु हो; ob1 == ob2 केवल तभी ob1 is ob2True है। do_richcompare() function in object.c देखें; याद रखें कि कोड में == ऑपरेटर पॉइंटर्स की तुलना कर रहा है।

+0

मुझे कल्पना है कि ऐसा इसलिए है क्योंकि समानता का उपयोग बहुत अधिक होता है, यह इसे मैन्युअल रूप से कार्यान्वित करने के लिए समझ में आता है। –

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