所以我有一個襯墊:Python的行爲豐富的比較(或者,當十進制(「100.0」)<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單身。」
所以這裏真的有三個問題。
當一個豐富的比較方法返回NotImplemented,會發生什麼?爲什麼它不會引發異常?
當它得到NotImplemented時,它爲什麼會在第一種情況下返回False,在第二種情況下爲True?布爾(NotImplemented)應該是一個常量。
它是否會退回到id()檢查?似乎沒有(或肯定的,但向後):
(忽略此行,格式化被搞砸了,這修復它)
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
啊,我不知道類型對象上的交叉類型排序。感謝您的明確解釋。 – 2010-05-14 14:50:15
那麼,在經過大量的手動和鬍鬚拉動之後,Python 2.7中的規則已經放鬆了一點:現在小數和浮點實例相互比較明智。主要的技術問題是保留這樣的規則:比較相等的數字也應該相等。 (不要試圖比較小數和小數實例,但!) – 2010-05-25 08:48:14