Почему Десятичный ('0')> 9999.0 Истинных в Python?

Это так или иначе связано с моим вопросом, Почему''> 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

Я еще более озадаченный теперь. % - (

5
задан Community 23 May 2017 в 11:55
поделиться

2 ответа

Поскольку десятичный модуль не сравнивается ни с одним типом, кроме 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.
  • Попробовано несколько других операций сравнения. Сравнение не выдерживает.
  • Вызывается сравнение по умолчанию в Objects / object.c / default_3way_compare CPython.
  • В Python 3 это справедливо. В Python 2 он сравнивает функции id ().
  • В Windows используется сравнение без учета регистра (вроде). В современных системах используется сравнение с учетом регистра .
  • Значит, вы получите разные результаты.

Мы уже там?

12
ответ дан 18 December 2019 в 14:44
поделиться
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
1
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: