So habe ich eine Motto:Python Verhalten für reichen Vergleich (Oder wenn Dezimal (‚100.0‘) <.01)
import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01))
Alles, was es tut, ist ein Dezimal-Objekt macht 100,0 halten, und vergleicht sie zu .01 (der Schwimmer) auf verschiedene Arten.
Mein Ergebnis ist:
>>> import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01))
(False, True, NotImplemented, NotImplemented)
Aus der Dokumentation: „Ein reiches Vergleichsverfahren kann die Singleton zurückkehren NotImplemented, wenn es nicht um den Betrieb für ein gegebenes Paar von Argumenten nicht implementiert“
Also wirklich, es gibt drei Fragen hier.
Wenn eine reiche Vergleichsmethode NotImplemented zurückgibt, was passiert? Warum erhebt es keine Ausnahme?
Wenn es NotImplemented wird, warum gibt es False im ersten Fall und True in der Sekunde zurück? bool (NotImplemented) sollte eine Konstante sein.
Geht es einfach zurück auf id()? Es scheint keine (oder ja, aber nach hinten):
(diese Zeile ignorieren, wird die Formatierung geschraubt und diese fixiert es)
from decimal import Decimal
h = Decimal('100.0')
f = .01
print h < f, id(h) < id(f)
print h > f, id(h) > id(f)
Meine Ergebnisse wurden getestet auf:
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
Edit: Dokumentation über die Bestellung: http://docs.python.org/library/stdtypes.html#comparisons
Ah, ich wusste nichts über die Kreuztyp-Sortierung auf dem Typ-Objekt. Danke für deine klare Erklärung. –
Nun, nach viel Handwringen und Bartziehen wurden die Regeln in Python 2.7 ein wenig gelockert: Dezimal- und Float-Instanzen vergleichen sich jetzt sinnvoll miteinander. Das technische Hauptproblem bestand darin, die Regel beizubehalten, dass Zahlen, die mit "Gleich" übereinstimmen, auch gleich "Hash" sein sollten. (Versuchen Sie jedoch nicht, Dezimal - und Bruchinstanzen zu vergleichen!) –