तो मैं एक एक लाइनर है:अजगर के व्यवहार (या, दशमलव ('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 वापस आ सकते हैं"
तो वास्तव में यहां तीन प्रश्न हैं।
जब एक समृद्ध तुलना विधि वापस नहीं आती है, तो क्या होता है? यह अपवाद क्यों नहीं उठाता है?
जब इसे लागू नहीं किया जाता है, तो यह पहले मामले में गलत क्यों होता है, और दूसरे में सच है? बूल (लागू नहीं) स्थिर होना चाहिए।
क्या यह बस आईडी() जांच पर वापस आ जाता है? यह (या हाँ, लेकिन पीछे की ओर) नहीं लगता है:
(इस लाइन पर ध्यान न दें, स्वरूपण बँधा हुआ है और यह इसे ठीक करता है)
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
आह, मुझे टाइप ऑब्जेक्ट पर क्रॉस प्रकार सॉर्टिंग के बारे में पता नहीं था। आपकी स्पष्ट व्याख्या के लिए धन्यवाद। –
ठीक है, बहुत हाथ wringing और दाढ़ी खींचने के बाद, नियम Python 2.7 में थोड़ा आराम कर दिया गया है: दशमलव और फ्लोट उदाहरण अब एक दूसरे के साथ समझदारी से तुलना करें। मुख्य तकनीकी मुद्दा नियम को संरक्षित कर रहा था कि बराबर की तुलना करने वाली संख्याओं को भी हैश बराबर होना चाहिए। (यद्यपि दशमलव और फ्रैक्शन उदाहरणों की तुलना करने की कोशिश न करें!) –