为什么是十进制('0')> 9999.0在Python中是真的吗?

时间:2010-03-11 23:40:06

标签: python comparison types operators logic

这与我的问题Why is ''>0 True in Python?

有某种关联

在Python 2.6.4中:

>> Decimal('0') > 9999.0
True

answer到我原来的问题,我理解在比较Python 2.x中不同类型的对象时,类型按名称排序。但在这种情况下:

>> type(Decimal('0')).__name__ > type(9999.0).__name__
False

为什么Decimal('0') > 9999.0 == True呢?

更新:我通常在Ubuntu上工作(Linux 2.6.31-20-generic#57-Ubuntu SMP Mon Feb 8 09:05:19 UTC 2010 i686 GNU / Linux,Python 2.6.4(r264:75706,Dec 7) 2009,18:45:15)[gCC 4.4.1]关于linux2)。在Windows上(winX上的WinXP Professional SP3,Python 2.6.4(r264:75706,2009年11月3日,13:23:17)[MSC v.1500 32位(英特尔)],我的原始声明的工作方式不同:

>> Decimal('0') > 9999.0
False

我现在更加困惑。 % - (

2 个答案:

答案 0 :(得分:12)

因为十进制模块不与除long,int和Decimal之外的任何类型进行比较。在所有其他情况下,十进制静默地返回“不是它知道对象的东西”更大。您可以在decimal.py

的_convert_other()函数中看到此行为

愚蠢,愚蠢的十进制课。

哦,请参阅http://bugs.python.org/issue2531

所以,这是发生的事情:

  • 解释器调用Decimal.__gt__比较函数。
  • Decimal.__gt__调用Decimal._convert_other将传入的float转换为Decimal。
  • Decimal._convert_other不了解花车。 Decimal._convert_other中的实施情况 明确检查操作数的longintDecimal类型。对,这就是 一个错误,因为意外的库实现会导致错误进一步发生。它 做正确的事情甚至只是通过TypeException会更干净。代替 它通过相同的NotImplemented来比较一个Decimal,比如, 员工记录的哈希。
  • 尝试了一些其他比较操作。比较放弃了。
  • 调用CPython的Objects / object.c / default_3way_compare中的默认比较。
  • 在Python 3中,这是正确的barfs。在Python 2中,它比较了id()函数。
  • 在Windows上,使用不区分大小写的比较(排序)。在现代系统上,a 使用区分大小写的比较。
  • 所以你会得到不同的结果。

我们还在吗?

答案 1 :(得分:1)

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