Generische Funktionen in 6 Zeilen Code

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Donnerstag 3. April 2008, 08:25

Ich habe neulich jemanden mit Hilfe dieses Codes von Python vorgeschwärmt. Vielleicht findet es ja noch jemand interessant.

Aufgabe:

Code: Alles auswählen

E = ('mul', ('add', ('lit', 3), ('lit', 4)), ('lit', 3))
print evl(E)
Lösung:

Code: Alles auswählen

@gen
def evl_mul(x, y): return evl(x) * evl(y)

@gen
def evl_add(x, y): return evl(x) + evl(y)

@gen
def evl_lit(x): return x
Meta-Magie:

Code: Alles auswählen

def gen(f):
    b, s = f.__name__.split("_")
    g = globals()
    if b not in g:
        def gen(t): return g[b].func_dict[t[0]](*t[1:])
        g[b] = gen
    g[b].func_dict[s] = f
Stefan
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Donnerstag 3. April 2008, 10:32

Da ist man glatt versucht, das Zitat

"Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp"

um

"...which is, more or less an implementation python's tuples"

erweitern ;)
Ne, aber schon ziemlich cool, was man so machen kann.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Donnerstag 3. April 2008, 11:48

Ist `evl()` hypothetisch oder wo soll das herkommen?
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Donnerstag 3. April 2008, 11:55

Y0Gi hat geschrieben:Ist `evl()` hypothetisch oder wo soll das herkommen?
wenn ich das richtig verstehe, wird es hier

Code: Alles auswählen

if b not in g:
        def gen(t): return g[b].func_dict[t[0]](*t[1:])
        g[b] = gen
angelegt, wenn es nicht existiert.
Das ganze sollte auch mit anderen prefixes klappen.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Donnerstag 3. April 2008, 22:38

Wenn schon Magie, dann richtig. Also f.func_globals statt globals().
TUFKAB – the user formerly known as blackbird
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Samstag 5. April 2008, 08:36

Stimmt. Danke.

Stefan
Antworten