Seite 1 von 1

Fehler bei nicht vorhandenem Obejtattribut abfangen

Verfasst: Samstag 10. Februar 2007, 10:30
von hiasl
Hallo,

nachdem man in Python ziemlich viel anstellen kann - gibt es eine Möglichkeit, bei einem Objekt ein nicht vorhandenes Attribut aufzurufen und den resultierenden Fehler im aufgerufenen Objekt selbst zu behandeln?

Beispiel

Code: Alles auswählen

class X(object):
    def a(self):
        pass

    def b(self):
        pass

    def fehlerHandler(self, attribut, params):
        print str(attribut) + str(params)
x = X()
x.c -> Fehler!
x.c(1,2,3) -> Fehler!

Jetzt sollte aber keine Exception von dem Interpreter geschmissen sondern fehlerHandler oder sonst eine Routine im Objekt aufgerufen werden.
Wichtig wäre es, dass der Aufrufer davon nichts mitbekommt.

Falls jemand einen Tipp oder eine Idee hat, wäre das super!

Ciao
Matthias

Edit (Leonidas): Code in Python-Tags gesetzt.

Re: Fehler bei nicht vorhandenem Obejtattribut abfangen

Verfasst: Samstag 10. Februar 2007, 11:13
von Leonidas
hiasl hat geschrieben:Falls jemand einen Tipp oder eine Idee hat, wäre das super!
Sowas?

Code: Alles auswählen

In [1]: class X(object):
   ...:     def a(self):
   ...:         pass
   ...:
   ...:     def b(self):
   ...:         pass
   ...:
   ...:     def error_handler(self, name):
   ...:         print name
   ...:
   ...:     def __getattr__(self, name):
   ...:         self.error_handler(name)
   ...:
In [2]: x = X()
In [3]: x.c
c
c
Bitte nutze in Zukunft die Code-Tags, dann muss ich nicht manuell alle von dir eingefügten Unterstriche löschen.

Verfasst: Samstag 10. Februar 2007, 12:28
von hiasl
Hi Leonidas,

danke für den Tipp. Jetzt würde ich nur noch gerne den Aufruf an eine unbekannte Methode abfangen und umleiten. Geht das auch? In der Sprachreferenz habe ich dazu nichts gefunden...

x.c(params) -> x.handler(params)

Gruß
Matthias

Verfasst: Samstag 10. Februar 2007, 12:45
von Leonidas
Das geht auch, sogar auf dem selben Weg:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

class UnknownHandlingClass(object):
    def a(self):
        pass

    def b(self):
        pass

    def error_handler(self, *args, **kwargs):
        print "I was called with", args, "as arguments"
        print "And", kwargs, "as keyword arguments"

    def __getattr__(self, name):
        return self.error_handler

test = UnknownHandlingClass()
print test.c
test.c('haha')

Verfasst: Samstag 10. Februar 2007, 13:50
von hiasl
Vielen Dank!

letzte Frage - gibt es noch die Möglichkeit innerhalb von __getattr__ zu unterscheiden, ob "name" als Methode oder Attribut aufgerufen wurde?

Verfasst: Samstag 10. Februar 2007, 13:59
von rayo
Nein gibt es nicht weil es immer getattr macht und von da an weiss das Object selber nicht mehr was mit dem zurückgegebenen Attribut passiert, also ob es noch mit runden Klammern aufgerufen wird.

Beim Object wird bei beiden die __getattr__-Methode aufgerufen, darum kann man das nicht unterscheiden.

Gruss

Verfasst: Montag 12. Februar 2007, 11:25
von Mad-Marty
hiasl hat geschrieben:Vielen Dank!

letzte Frage - gibt es noch die Möglichkeit innerhalb von __getattr__ zu unterscheiden, ob "name" als Methode oder Attribut aufgerufen wurde?

Du kannst maximal überprüfen ob das zurückgegebene callable ist ...