Seite 1 von 1

prüfen ob eine Object eine bestimmte Variable hat

Verfasst: Donnerstag 27. November 2008, 21:40
von Twilo
Hallo,

wie kann ich prüfen, ob im folgenden Beispiel das Object die Variable P_TEST hat?

Code: Alles auswählen

class Test1(Test):
    P_TEST = '-test'
    ...
per google habe ich Testen, ob eine Python Variable existiert gefunden, funktioniert das auch irgendwie bei Objekten?

mfg
Twilo

Verfasst: Donnerstag 27. November 2008, 22:02
von Leonidas
Das ist keine Variable sondern ein Attribut und dafür gibt es ``hasattr()``.

Verfasst: Donnerstag 27. November 2008, 23:05
von DeJe
Ich mag mich irren...aber bei sauberer Programmierung sollten solche Tests nur zur Fehlersuche nötig sein. ;)

Verfasst: Donnerstag 27. November 2008, 23:27
von DasIch
Nicht bei jeder Anwendung kennt man die Objekte mit denen man zu tun hat, da muss man dann entweder hasattr nutzen oder Exceptions abfangen.

Verfasst: Freitag 28. November 2008, 09:51
von Leonidas
Ich finde ``hasattr()`` durchaus akzeptabel in bestimmten Fällen. Das ist zwar LBYL aber in manchen Fällen führt es zu klarerem Code. Zugegeben, besonders oft braucht man ``hasattr()`` aber in aller Regel nicht.

Autovivification von Klassenattributen

Verfasst: Freitag 28. November 2008, 10:50
von farid
Leonidas hat geschrieben:Ich finde ``hasattr()`` durchaus akzeptabel in bestimmten Fällen. Das ist zwar LBYL aber in manchen Fällen führt es zu klarerem Code. Zugegeben, besonders oft braucht man ``hasattr()`` aber in aller Regel nicht.
Was ist an LBYL in diesem Zusammenhang falsch? Ich könnte mir durchaus Klassen vorstellen, bei denen durch EAFP alleine schon das Abfragen von nicht-existierenden Klassenattributen diese auf "magische" Art und Weise ins Leben ruft. Eine Art Autovivification für Attribute, wenn man es überhaupt so nennen kann.

Als kleine Denksport-Aufgabe stellt sich die Frage, wie Attribut-Autovivification bei Python-Klassen bewerkstelligt werden könnte. ;)

Verfasst: Freitag 28. November 2008, 11:34
von lunar
DeJe hat geschrieben:Ich mag mich irren...aber bei sauberer Programmierung sollten solche Tests nur zur Fehlersuche nötig sein. ;)
Ob man nun eine Ausnahme abfängt oder vorher nachfragt, ist doch letztendlich egal. Man sollte das nehmen, was im Code besser zu lesen ist. "Readability counts" und "practicality beats purity"


@farid
"hasattr" und das Auslösen eines "AttributeError" sollten sich nicht unterschiedlich verhalten. Wenn "hasattr" False liefert, sollte der Zugriff auf ein Attribut mit "AttributeError" fehlschlagen.

Re: Autovivification von Klassenattributen

Verfasst: Samstag 29. November 2008, 11:32
von sma
farid hat geschrieben:Als kleine Denksport-Aufgabe stellt sich die Frage, wie Attribut-Autovivification bei Python-Klassen bewerkstelligt werden könnte. ;)
Meinst du dies?

Code: Alles auswählen

class X(object):
    def __getattr__(self, name):
        if name not in self.__dict__:
            self.__dict__[name] = 42
        return self.__dict__[name]
        
x = X()
print hasattr(x, 'abc')
print x.__dict__
Stefan

Verfasst: Samstag 29. November 2008, 15:02
von Twilo
Hallo,

danke für die Antwort - hasattr funktioniert.

mfg
Twilo