Objekte unterschiedlichen Typs mit einander vergleichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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?
philistion
User
Beiträge: 108
Registriert: Sonntag 7. Februar 2010, 14:16

Poste mal die __cmp__ Methode deiner Klasse, bzw. am Besten den ganzen Code hier: http://paste.pocoo.org/
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

    def __cmp__(self, other):
        try:
            other = other.date
        except TypeError, AttributeError:
            pass
       return cmp(self.date, other)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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:
..
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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()
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Dann musst du wohl __lt__ und Kollegen implementieren.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Antworten