Seite 1 von 1

Datentyp mit Punktoperator?

Verfasst: Samstag 26. Juni 2010, 12:48
von Shaldy
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!

Re: Datentyp mit Punktoperator?

Verfasst: Samstag 26. Juni 2010, 13:14
von Hyperion
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?

Re: Datentyp mit Punktoperator?

Verfasst: Samstag 26. Juni 2010, 13:15
von snafu
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. ;)

Re: Datentyp mit Punktoperator?

Verfasst: Samstag 26. Juni 2010, 20:52
von Shaldy
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.

Re: Datentyp mit Punktoperator?

Verfasst: Samstag 26. Juni 2010, 21:08
von BlackJack
@Shaldy: Klingt für mich nach einem Einsatzgebiet für Ausnahmen!?

Re: Datentyp mit Punktoperator?

Verfasst: Samstag 26. Juni 2010, 21:24
von Shaldy
@BlackJack: So ziemlich, aber gibt es trotzdem irgendeine Möglichkeit, diese Schreibweise zu implementieren?

Re: Datentyp mit Punktoperator?

Verfasst: Samstag 26. Juni 2010, 23:08
von Hyperion
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

Re: Datentyp mit Punktoperator?

Verfasst: Samstag 26. Juni 2010, 23:34
von BlackJack
@Shaldy: Natürlich kann man die Schreibweise implementieren. Mach doch einfach. Ist ja nun keine Hexerei oder so…

Re: Datentyp mit Punktoperator?

Verfasst: Sonntag 27. Juni 2010, 01:02
von Shaldy
Ja, aber wie? xD

Re: Datentyp mit Punktoperator?

Verfasst: Sonntag 27. Juni 2010, 01:52
von DasIch

Code: Alles auswählen

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

Re: Datentyp mit Punktoperator?

Verfasst: Sonntag 27. Juni 2010, 11:27
von lunar
@DasIch: Das ist weder besonders schön, noch besonders elegant. Ein Datentyp, der "__getattr__()" entsprechend überlädt, wäre die Lösung.

Re: Datentyp mit Punktoperator?

Verfasst: Sonntag 27. Juni 2010, 11:58
von snafu

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.

Re: Datentyp mit Punktoperator?

Verfasst: Sonntag 27. Juni 2010, 12:38
von sma
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