2009-07-24 11 views
4

zuerst den Code:Vergleiche unähnliche Typen in Python

class myClass(object): 
    def __cmp__(self, other): 
     return cmp(type(self), type(other)) or cmp(self.__something, other.__something) 

Enthält diese die gleiche Ordnung erzeugen, wie für andere Arten in Python? Gibt es eine korrekte Idiom dafür?

Related question:

Ein bisschen schaut sich um auf Google fand ich einige relevante Informationen in der python docs. Zitiert:

Umsetzung beachten Sie: Objekte verschiedenen Typen außer Zahlen durch ihre Typnamen geordnet; Objekte der gleichen Typen, die richtigen Vergleich nicht unterstützen, sind nach ihrer Adresse geordnet.

Dies deutet darauf hin, dass, wenn ich das Verhalten folgen will, ich

class myClass(object): 
    def __cmp__(self, other): 
     return (cmp(self.__class__.__name__, other.__class__.__name) or 
       cmp(self.__something, other.__something)) 

Besonders bedauerlich verwenden soll, ist, dass ich eine außerordentlich schwierige Zeit mantaining transitivity mit dict s aufweisen, die ein Sonderfall ist I hatte gehofft zu implementieren.

Muss ich sogar die Arten meiner Argumente überprüfen? Lässt Python mich das sogar sehen?

+0

Können Sie die Frage ausarbeiten. Was meinst du mit "erzeug die gleiche Reihenfolge wie für andere Arten in Python"? –

+0

Beachten Sie, dass cmp (dict(), str()) ungleich Null ist. Ich möchte Transitivität mit meinem Typ vordefinierten Typen beibehalten, aber ich bin mir nicht sicher, wie ich das tatsächlich machen soll. – SingleNegationElimination

Antwort

1

Python 2 unterstützt leider solche "Alien" -Vergleiche (glücklicherweise in Python 3 aufgehoben). Es ist NICHT einfach das eingebaute Verhalten zu emulieren, da es so viele Spezialfälle hat, zB float und int direkt vergleichen (kein Typ-Vergleich Override wie du es hast) aber complex macht jeden Vergleich (außer == und! =) immer eine Ausnahme auslösen. Haben Sie wirklich müssen alle diese Macken und Wackeln emulieren? Eine solche Notwendigkeit wäre sehr ungewöhnlich. Wenn Ihr Typ "numerisch" ist (z. B. dezimal.Dezimal), muss er mit anderen numerischen Typen gut funktionieren, aber Typen, die keine "vergleichbaren Zahlen" sind, haben weniger sinnvolle Einschränkungen ...!

0

Was versuchen Sie eigentlich? Warum möchten Sie Instanzen verschiedener Klassen nach Klasse/Typ sortieren oder vergleichen?

Es ist schwer, eine Lösung vorzuschlagen, wenn Sie das Problem nicht tatsächlich gemeldet haben.

Sie müssen Ihre eigenen Vergleichsmethoden für benutzerdefinierte Klassen definieren, und es liegt weitgehend bei Ihnen, sicherzustellen, dass alle von Ihnen durchgeführten Vergleiche sinnvoll sind.

Bitte erläutern Sie, was Sie erreichen möchten. Dies ist möglicherweise nicht der pythonische Weg.