Datatypes in Python

06/07/2008 - 16:19 von Florian Weimer | Report spam
Diverse ML-Varianten haben ein nettes Konstrukt der Form:

datatype t = NULL | I of int | S of string

Will sagen: Werte von Typ t sind entwender NULL, oder sind ein I mit
Zahl-Argument oder ein S mit Zeichenketten-Argument. Man kann damit
z.B. schreiben:

case var of
NULL => macheNULL ()
| I iVar => macheInt iVar
| S sVar => if sVar <> "" then macheString sVar else ()

D.h. man kann recht elegant die verschiedenen Fàlle abhandeln.

Ich stelle mir für Python in etwa sowas vor:

T = mkEnum(name="T", const=["NULL"], params=["I", "S"])

Als Wertkonstruktoren fungieren dann T.NULL, T.I(0), T.S("foo") (wobei
keine Typprüfung der Argumente stattfindet). Irgendwie sollte man einen
Visitor aufrufen, also etwa:

class V(T.visitor):
def NULL(self): macheNULL()
def I(self, iVar): macheInt(iVar)
def S(self, sVar): if s <> "": macheStrig(sVar)
V().visit(var)

Die visit-Methode sollte prüfen, ob var tatsàchlich den passenden Typ
hat. Vielleicht geht das syntaktisch auch noch etwas eleganter.

Gibt's sowas schon? Enums (die einfache Variante davon) scheinen noch
nicht den Weg in die Standardbibliothek gefunden zu haben...
 

Lesen sie die antworten

#1 Marc BlackJack Rintsch
06/07/2008 - 17:08 | Warnen spam
On Sun, 06 Jul 2008 16:19:57 +0200, Florian Weimer wrote:

Diverse ML-Varianten haben ein nettes Konstrukt der Form:

datatype t = NULL | I of int | S of string

Will sagen: Werte von Typ t sind entwender NULL, oder sind ein I mit
Zahl-Argument oder ein S mit Zeichenketten-Argument. Man kann damit
z.B. schreiben:

case var of
NULL => macheNULL ()
| I iVar => macheInt iVar
| S sVar => if sVar <> "" then macheString sVar else ()

D.h. man kann recht elegant die verschiedenen Fàlle abhandeln.

Ich stelle mir für Python in etwa sowas vor:

T = mkEnum(name="T", const=["NULL"], params=["I", "S"])

Als Wertkonstruktoren fungieren dann T.NULL, T.I(0), T.S("foo") (wobei
keine Typprüfung der Argumente stattfindet). Irgendwie sollte man einen
Visitor aufrufen, also etwa:

class V(T.visitor):
def NULL(self): macheNULL()
def I(self, iVar): macheInt(iVar)
def S(self, sVar): if s <> "": macheStrig(sVar)
V().visit(var)

Die visit-Methode sollte prüfen, ob var tatsàchlich den passenden Typ
hat. Vielleicht geht das syntaktisch auch noch etwas eleganter.

Gibt's sowas schon? Enums (die einfache Variante davon) scheinen noch
nicht den Weg in die Standardbibliothek gefunden zu haben...



Klingt ein bisschen so, als wenn man das mit "multimethods" umsetzen kann.
Da gibt's verschiedene Module, wirf mal 'ne Suchmaschine an.

Ciao,
Marc 'BlackJack' Rintsch

Ähnliche fragen