Datentyp mit Punktoperator?

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
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Hey Leute!

Ich habe eine Klasse 'Server' erstellt. Darin sollen Strings als Antworten von einem Server gespeichert werden z.B. "LoginOk" oder "wrongUserData". Da es aber verschiedene Funktionen gibt, die man auf dem Server ausführen kann gibt es natürlich auch verschiedene Antworten.
Die möchte ich aufteilen z.B. "Login", "Aufgabe1", Aufgabe2".

Mein eigentlichen Problem ist jetzt, dass ich die Klasse 'Server' so nutzen möchte:

Code: Alles auswählen

if Server.Login.Ok:
    ...
if Server.Aufgabe1.failed:
    ...
Also ich möchte mit dem Punktoperator arbeiten ohne, dass Login und Aufgabe1 eigene Klassen sind sondern mehr so ein Aufzählungstyp. Ich hoffe ihr wisst wie ich das meine ^^"

Danke im Vorraus!
Dies ist keine Signatur!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Shaldy hat geschrieben: Also ich möchte mit dem Punktoperator arbeiten ohne, dass Login und Aufgabe1 eigene Klassen sind sondern mehr so ein Aufzählungstyp. Ich hoffe ihr wisst wie ich das meine ^^"
Dann fielen mir nur noch Module ein (was in diesem Zusammenhang vollkommen fehl am Platze ist)... aber wozu willst Du denn zwanghaft eine eigene Notation einführen? Nutze doch einfach die Möglichkeiten, die Dir Python bietet! Da musst Du dann eben eigene Klasse für die weitere Kaskadierung bauen.

Willst Du eigentlich wirklich auf Klassen arbeiten oder auf Objekten vom Typ dieser Klasse?

Allerdings kapiere ich die Semantik Deiner Beispiele nicht so wirklich:

Code: Alles auswählen

# deine angabe
if Server.Login.Ok:
    pass

# ich würde das eher so lesen;
if Server.Login:
    pass
Wozu das "Ok" als Attribut?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Zunächst einmal ist es generell keine gute Idee, Namen wie `Aufgabe1`, `Aufgabe2`, usw zu haben. Das lässt sich viel eleganter mit einer Liste lösen: `server.aufgaben[0].failed`. Wenn diese Aufgaben tatsächlich über einen Punkt angesprochen werden sollen, dann müssen es zwangsläufig Klassen mit Attributen (hier via `@property`) sein, denn der Punkt ist nun mal ein Attributzugriff. Mir schwant irgendwie - ohne dir zu nahe treten zu wollen -, dass du noch nicht ganz vertraut mit grundsätzlichen Konzepten von Python bist.

@Hyperion:
Ich würde ja auf `if (Server.Login.OK == 1):` testen. ;)
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Also ich verbinde mich mit einem Server, der Subdomains verwaltet.
Ich muss mich einloggen, um neue Domains zu registrieren, zu bearbeiten oder zu löschen. Wenn ich z.B. eine Domain löschen will gibt es folgende Möglichkeiten, wie mir der Server antwortet:
1. Löschen okay
2. User ist nicht Besitzer der Domain
3. Die Domainendung ist nicht korrekt
4. Der Server kann den Grund nicht feststellen
Die Antworten sind alle Strings und ich möchte sie in der Serverklasse unter eigenem Namen abspeichern um später nur noch zu schreiben:

Code: Alles auswählen

if antwort == Server.DeleteOk:
    ...
Jetzt gibt es aber sehr ähnliche Antworten für die verschiedenen Aufgaben. Also wäre es mir lieber zu schreiben:

Code: Alles auswählen

if Server.DeleteDomain.Ok:
    pass
Ist mir so am liebsten, da ich später nicht mit den Servermeldungen durcheinanderkommen will und mir die Lesbarkeit etwas mehr am Herzen liegt als die optimale Implementieren ^^

Danke.
Dies ist keine Signatur!
BlackJack

@Shaldy: Klingt für mich nach einem Einsatzgebiet für Ausnahmen!?
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

@BlackJack: So ziemlich, aber gibt es trotzdem irgendeine Möglichkeit, diese Schreibweise zu implementieren?
Dies ist keine Signatur!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

snafu hat geschrieben: @Hyperion:
Ich würde ja auf `if (Server.Login.OK == 1):` testen. ;)
Hm... woher weißt Du, ob da eine 1 als Wert steht? Und die Klammern sind häßlich :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Shaldy: Natürlich kann man die Schreibweise implementieren. Mach doch einfach. Ist ja nun keine Hexerei oder so…
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Ja, aber wie? xD
Dies ist keine Signatur!
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Code: Alles auswählen

obj = type('obj', (object, ), {})
Server = obj()
Server.Login = obj()
Server.Login.Ok = True
if Server.Login.Ok:
    print 'yipee'
lunar

@DasIch: Das ist weder besonders schön, noch besonders elegant. Ein Datentyp, der "__getattr__()" entsprechend überlädt, wäre die Lösung.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

try:
    server.delete()
except ServerError, error:
    if error.reason == PERMISSION_DENIED:
        ...
Falls du weiterhin vor hast, eine eigene Syntax zu implementieren, dann würde ich das an deiner Stelle getrennt von Python machen und einen Parser als Schnittstelle ausliefern.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

lunar hat geschrieben:@DasIch: Das ist weder besonders schön, noch besonders elegant. Ein Datentyp, der "__getattr__()" entsprechend überlädt, wäre die Lösung.
Ich finde DasIchs prototypischen Ansatz passend und einfacher als die Metaebene mit `__getattr__` zu bemühen.

Stefan
Antworten