Это так или иначе связано с моим вопросом, Почему''> 0 Истинных в Python?
В Python 2.6.4:
>> Decimal('0') > 9999.0
True
От ответа до моего исходного вопроса я понимаю, что при сравнении объектов различных типов в Python 2.x типы заказаны их именем. Но в этом случае:
>> type(Decimal('0')).__name__ > type(9999.0).__name__
False
Почему Decimal('0') > 9999.0 == True
затем?
ОБНОВЛЕНИЕ: Я обычно работаю над Ubuntu (Linux 2.6.31-20-универсальный # SMP с 57 Ubuntu понедельник 8 февраля 9:05:19 UTC 2010 i686 GNU/Linux, Python 2.6.4 (r264:75706, 7 декабря 2009, 18:45:15) [GCC 4.4.1] на linux2). В Windows (WinXP Professional SP3, Python 2.6.4 (r264:75706, 3 ноября 2009, 13:23:17) [MSC v.1500 32 бита (Intel)] на win32) мой исходный оператор работает по-другому:
>> Decimal('0') > 9999.0
False
Я еще более озадаченный теперь. % - (
Поскольку десятичный модуль не сравнивается ни с одним типом, кроме long, int и Decimal. Во всех других случаях decimal молча возвращает «не то, что он знает об объекте» как большее. Вы можете увидеть это поведение в функции _convert_other () в decimal.py
Глупый, глупый класс Decimal.
О, см. Также http://bugs.python.org/issue2531 .
Итак, вот что происходит:
Decimal .__ gt __
. Decimal .__ gt __
вызывает Decimal._convert_other
для преобразования входящего числа с плавающей точкой в Decimal. Decimal._convert_other
не понимает числа с плавающей запятой. Реализация в Decimal._convert_other
явно проверяет типы операнда long
, int
и Decimal
. Да, это
ошибка, поскольку неожиданные реализации библиотеки вызывают ошибки в дальнейшем. Было бы чище, если бы
поступили правильно или даже с помощью исключения TypeException
. Вместо этого
он использует тот же метод NotImplemented
, который происходит при сравнении Decimal, скажем, с
хешем записей Employee. Мы уже там?
def __gt__(self, other, context=None):
other = _convert_other(other)
if other is NotImplemented:
return other
ans = self._compare_check_nans(other, context)
if ans:
return False
return self._cmp(other) > 0
def _convert_other(other, raiseit=False):
"""Convert other to Decimal.
Verifies that it's ok to use in an implicit construction.
"""
if isinstance(other, Decimal):
return other
if isinstance(other, (int, long)):
return Decimal(other)
if raiseit:
raise TypeError("Unable to convert %s to Decimal" % other)
return NotImplemented