prüfen ob eine Object eine bestimmte Variable hat

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Donnerstag 27. November 2008, 21:40

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 27. November 2008, 22:02

Das ist keine Variable sondern ein Attribut und dafür gibt es ``hasattr()``.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
DeJe
User
Beiträge: 39
Registriert: Sonntag 23. November 2008, 19:38

Donnerstag 27. November 2008, 23:05

Ich mag mich irren...aber bei sauberer Programmierung sollten solche Tests nur zur Fehlersuche nötig sein. ;)
DasIch
User
Beiträge: 2450
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Donnerstag 27. November 2008, 23:27

Nicht bei jeder Anwendung kennt man die Objekte mit denen man zu tun hat, da muss man dann entweder hasattr nutzen oder Exceptions abfangen.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 28. November 2008, 09:51

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

Freitag 28. November 2008, 10:50

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. ;)
lunar

Freitag 28. November 2008, 11:34

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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Samstag 29. November 2008, 11:32

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Samstag 29. November 2008, 15:02

Hallo,

danke für die Antwort - hasattr funktioniert.

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Antworten