这与我的问题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
我现在更加困惑。 % - (
答案 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
中的实施情况
明确检查操作数的long
,int
和Decimal
类型。对,这就是
一个错误,因为意外的库实现会导致错误进一步发生。它
做正确的事情甚至只是通过TypeException
会更干净。代替
它通过相同的NotImplemented
来比较一个Decimal,比如,
员工记录的哈希。我们还在吗?
答案 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