así que tengo un chiste:de Python para ricos comparación (O bien, cuando decimal ('100,0') <0,01)
import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01))
único que hace es hacer un objeto decimal sosteniendo 100,0, y lo compara a .01 (el flotador) de varias maneras.
Mi resultado es:
>>> import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01))
(False, True, NotImplemented, NotImplemented)
A partir de los documentos: "Un método de comparación rica puede devolver el producto único NotImplemented si no implementa la operación durante un par de argumentos dados"
Entonces, realmente hay tres preguntas aquí.
Cuando un método de comparación rico devuelve NotImplemented, ¿qué ocurre? ¿Por qué no plantea una excepción?
Cuando se obtiene NotImplemented, ¿por qué devuelve False en el primer caso y True en el segundo? bool (NotImplemented) debería ser una constante.
¿Simplemente recurre a la comprobación de id()? Parece que no (o sí, pero al revés):
(ignorar esta línea, el formato se arrugó y esto lo arregla)
from decimal import Decimal
h = Decimal('100.0')
f = .01
print h < f, id(h) < id(f)
print h > f, id(h) > id(f)
Mis resultados fueron probados en:
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Editar: Documentación sobre el pedido: http://docs.python.org/library/stdtypes.html#comparisons
Ah, no sabía sobre la ordenación cruzada del tipo de objeto. Gracias por tu clara explicación. –
Bueno, después de mucho retorcerse las manos y sacar la barba, las reglas se han relajado un poco en Python 2.7: las instancias de decimales y flotantes ahora se comparan sensiblemente entre sí. El principal problema técnico era preservar la regla de que los números que se comparan iguales también deberían ser iguales. (¡No intentes comparar las instancias Decimal y Fraction, sin embargo!) –