2010-05-14 9 views
5

तो मैं एक एक लाइनर है:अजगर के व्यवहार (या, दशमलव ('100.0') <.01 जब)

import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01)) 

सभी यह करता है एक दशमलव वस्तु 100.0 पकड़े बनाने के है, और यह तुलना विभिन्न तरीकों से .01 (फ्लोट) तक।

मेरे परिणाम है:

>>> import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01)) 
(False, True, NotImplemented, NotImplemented) 

डॉक्स से: "। एक अमीर तुलना विधि सिंगलटन अगर यह तर्क की दी जोड़ी के लिए आपरेशन को लागू नहीं करता है NotImplemented वापस आ सकते हैं"

तो वास्तव में यहां तीन प्रश्न हैं।

  1. जब एक समृद्ध तुलना विधि वापस नहीं आती है, तो क्या होता है? यह अपवाद क्यों नहीं उठाता है?

  2. जब इसे लागू नहीं किया जाता है, तो यह पहले मामले में गलत क्यों होता है, और दूसरे में सच है? बूल (लागू नहीं) स्थिर होना चाहिए।

  3. क्या यह बस आईडी() जांच पर वापस आ जाता है? यह (या हाँ, लेकिन पीछे की ओर) नहीं लगता है:

(इस लाइन पर ध्यान न दें, स्वरूपण बँधा हुआ है और यह इसे ठीक करता है)

from decimal import Decimal 
h = Decimal('100.0') 
f = .01 
print h < f, id(h) < id(f) 
print h > f, id(h) > id(f) 

मेरे परिणाम पर परीक्षण किया गया:

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32 
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32 

संपादित करें: ऑर्डर करने के बारे में दस्तावेज़ीकरण: http://docs.python.org/library/stdtypes.html#comparisons

उत्तर

6

जब एक समृद्ध तुलना विधि वापस नहीं आती है, तो क्या होता है? क्यों यह अपवाद नहीं उठाता है?

यह बातचीत विधि के प्रतिनिधियों (जैसे, __lt__ जब ऑपरेटर > है) की तुलना (float) में आरएचएस - जो इस मामले में भी NotImplemented रिटर्न - और अंत में अजगर 2 के मूर्खतापूर्ण वर्ष के लिए वापस गिर जाता है विषम तुलना के लिए नियम।

जब यह NotImplemented हो जाता है, यही कारण है कि यह पहले मामले में झूठी वापसी करता है, और दूसरे में यह सच है? बूल (NotImplemented) स्थिर होना चाहिए।

नहीं bool शामिल - के बाद से तुलना के दोनों ओर लौट NotImplemented (एक विचार डिजाइन निर्णय दशमलव और तैरता के बीच किसी भी आपरेशन का समर्थन नहीं करने के लिए की वजह से), मूर्ख पुराने नियम फ़ॉलबैक के रूप में उपयोग किया जाता है और (एक में हाल ही में पर्याप्त संस्करण प्रकारों की तुलना करेगा, उदाहरणों से नहीं - id के साथ इसके साथ कुछ लेना देना नहीं है)। पायथन 3 में, ऐसी असमर्थित विषम तुलना विफल हो जाएगी, और एक स्पष्ट अपवाद उठाएगा, लेकिन पाइथन 2 में, पीछे की संगतता के लिए, यह नहीं हो सकता है - इसे पाइथन 2 के पूरे जीवनकाल में मूर्ख तरीके से व्यवहार करना चाहिए।

पीछे की ओर असंगतियां का परिचय अब डिजाइन त्रुटियों माना जाता है क्या, हेट तुलना के बारे में इस हिस्से की तरह ठीक करने के लिए, था कोर अजगर 3. लागू करने के लिए जब तक आप अजगर 2 के लिए चिपके रहे कारण (जैसे इसे और अधिक है, क्योंकि तीसरे पक्ष के विस्तार, आदि), आपको केवल उन पायदानों के साथ ग्रिन और सहन करने की आवश्यकता है जो केवल पायथन 3 में तय की गई हैं।

+0

आह, मुझे टाइप ऑब्जेक्ट पर क्रॉस प्रकार सॉर्टिंग के बारे में पता नहीं था। आपकी स्पष्ट व्याख्या के लिए धन्यवाद। –

+0

ठीक है, बहुत हाथ wringing और दाढ़ी खींचने के बाद, नियम Python 2.7 में थोड़ा आराम कर दिया गया है: दशमलव और फ्लोट उदाहरण अब एक दूसरे के साथ समझदारी से तुलना करें। मुख्य तकनीकी मुद्दा नियम को संरक्षित कर रहा था कि बराबर की तुलना करने वाली संख्याओं को भी हैश बराबर होना चाहिए। (यद्यपि दशमलव और फ्रैक्शन उदाहरणों की तुलना करने की कोशिश न करें!) –

0

मेरे पास पायथन 2.6.4 है और आपका उदाहरण ठीक काम करता है , यानी, मुझे

(True, False, NotImplemented, NotImplemented) 

की अपेक्षा की जाती है। मुझे नहीं पता कि आप अलग-अलग परिणाम क्यों प्राप्त करते हैं।

बारे id: आईडी, तुलना के साथ क्या करना है ताकि के तहत किसी भी हालत आप id(a) < id(b) द्वारा a और b की तुलना करनी चाहिए, कि किसी भी मतलब नहीं है कुछ भी नहीं है। id स्मृति में एक एड्रेस की तरह थोड़ा सा है, इसलिए उनकी तुलना करने से कोई मतलब नहीं आता है।

+0

आईडी() ऑब्जेक्ट्स को सॉर्ट करने के लिए अंतिम उपाय के रूप में उपयोग किया जाता है यदि ऑब्जेक्ट्स अपनी तुलना को परिभाषित नहीं करते हैं। मुझे बिल्कुल याद नहीं आया जब इसका उपयोग किया जाता है, लेकिन यह निश्चित रूप से है। आप सही हैं कि यह समझ में नहीं आता है, जब तक कि आप यह गारंटी देने की कोशिश नहीं कर रहे थे कि "ऑब्जेक्ट्स को लगातार क्रमशः आदेश दिया जाता है (इसलिए एक विषम सरणी को क्रमबद्ध करने से लगातार परिणाम मिलता है)", जो दस्तावेज़ों के अनुसार, पायथन कर देता है। –

+0

यह आपके लिए इस तरह से काम करने के लिए होता है: 0.1 के बजाय 999.01 आज़माएं और आपको वही परिणाम दिखाई देंगे, जो आपको दिखा रहा है ** ** ** "ठीक काम नहीं करता" (यह एक बंद घड़ी है: दिन में दो बार सही ;-)। _types_ की तुलना में अंत हो रहा है (और इन प्रकार की तुलनाओं को अलग-अलग पायथन इंस्टॉलेशन में समान तरीके से काम करने की आवश्यकता नहीं है), _values_ जैसा कि सामान्य रूप से अपेक्षा नहीं करता है। –

+0

@ सीबी, 'आईडी' को _non-ordering_ तुलना (समानता और असमानता) और हैशिंग के अंतिम उपाय के रूप में उपयोग किया जाता है, जहां यह सही अर्थ बनाता है; यह _ordering_ तुलनाओं के लिए कभी भी उपयोग नहीं किया जाता है जैसे '<'। इसके बजाए, विषम क्रमिक तुलना मूल्य के बजाय _types_ की तुलना में समाप्त होती है। –

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