这在某种程度上与我的问题相关为什么在Python中''>0 True?
在 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,2009 年 12 月 7 日, 18:45:15) [GCC 4.4.1] 在 linux2) 上。在 Windows 上(WinXP Professional SP3、Python 2.6.4(r264:75706,2009 年 11 月 3 日,13:23:17)[MSC v.1500 32 位(Intel)] on win32)我原来的声明工作方式有所不同:
>> Decimal('0') > 9999.0
False
我现在更疑惑了。 %-(
因为decimal模块不与除long、int和Decimal之外的任何类型进行比较。 在所有其他情况下,小数会默默地返回“它不知道对象的某些信息”作为更大的值。 您可以在decimal.py的_convert_other()函数中看到这种行为
愚蠢、愚蠢的十进制类。
哦,另请参阅 http://bugs.python.org/issue2531。
所以,发生的事情是这样的:
Decimal.__gt__
比较函数。 Decimal.__gt__
调用 Decimal._convert_other
将传入的浮点数转换为十进制。Decimal._convert_other
不懂浮动。 实施在 Decimal._convert_other
显式检查操作数的 long
、int
和 Decimal
类型。 是的,这是
一个错误,因为意外的库实现会导致进一步的错误。 它
做正确的事情或者甚至只是通过 TypeException
会更干净。 反而
它会经历与将 Decimal 与例如进行比较时相同的 NotImplemented
员工记录的哈希值。我们到了吗?
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