Итак, у меня есть один вкладыш:
import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01))
Все, что он делает - это создает десятичный объект, содержащий 100.0, и сравнивает его с 0,01 (float) различными способами.
Мой результат:
>>> 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 во втором? bool (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