Seite 1 von 1

Objekte unterschiedlichen Typs mit einander vergleichen

Verfasst: Sonntag 28. Februar 2010, 20:26
von anogayales
Hi Community,

Ich habe eine eigene Klasse geschrieben und möchte diese mit einem Datum aus datetime.date vergleichen, also habe ich mir eine __cmp__ Methode in meiner Klasse definiert, die genau das macht.

Leider bekomme ich aber einen TypeError und leider auch nicht in der Methode, sondern bereits bevor die Methode aufgerufen wird.

Code: Alles auswählen

datetime.date(2010, 1 , 1) > Klasse1

Code: Alles auswählen

TypeError: can't compare datetime.date to Klasse
Sprich, ich habe gar keine Möglichkeit die exception in der __cmp__ Methode abzufangen!

Kennt jemand eine Lösung für das Problem?

Verfasst: Sonntag 28. Februar 2010, 20:45
von philistion
Poste mal die __cmp__ Methode deiner Klasse, bzw. am Besten den ganzen Code hier: http://paste.pocoo.org/

Verfasst: Sonntag 28. Februar 2010, 21:21
von anogayales
Meine __cmp__() sieht so aus:

Code: Alles auswählen

    def __cmp__(self, other):
        try:
            cmpdate = other.date
        except TypeError, AttributeError:
            cmpdate = other
        
        if self.date == cmpdate:
            return 0
        elif self.date < cmpdate:
            return -1
        else:
            return 1
Meine Klasse besitzt eine date() Instanz an instanz.date.

Mir ist klar, dass die Exception momentant nichts bringt.

Es soll falls Klassen vom gleichen Typ verglichen werden einmal die instanz.date aufgeruft werden, in allen anderen Fällen soll das datum direkt verglichen werden.

Verfasst: Montag 1. März 2010, 01:11
von jbs

Code: Alles auswählen

    def __cmp__(self, other):
        try:
            other = other.date
        except TypeError, AttributeError:
            pass
       return cmp(self.date, other)

Verfasst: Montag 1. März 2010, 01:20
von cofi
Die `except`-clauses sind auch kaputt, der `TypeError` wird abgefangen und `AttributeError` genannt.

Code: Alles auswählen

except (TypeError, AttributeError), e:
..
Ab Python 3.x:

Code: Alles auswählen

except TypeError, AttributeError as e:
..

Verfasst: Dienstag 2. März 2010, 17:49
von anogayales
Wie gesagt, so klappt es leider nicht, überzeugt euch doch selbst.

Ich hab hier ein Minimalbeispiel gepostet:

Code: Alles auswählen

import datetime


class Klasse(object):
    def __init__(self):
        self.date = datetime.date(2010, 1, 1)
    
    def __cmp__(self, other):         
        try: 
            other = other.date 
        except (TypeError, AttributeError), e: 
            pass
        return cmp(self.date, other)


print datetime.date(2010, 2, 1) < Klasse()

Verfasst: Dienstag 2. März 2010, 18:10
von jbs
Dann musst du wohl __lt__ und Kollegen implementieren.