Seite 1 von 1

Module für ifthenelse und switch !!

Verfasst: Mittwoch 7. Januar 2004, 23:37
von Beyond
Hi,

ich hab's mit ein paar Tricks hinbekommen ein Module für ifthenelse und switch zu schreiben.
Die ganze Evaluation funktioniert korrekt (denke ich zumindest -- testet es ruhig) d.h. die Expressions werden erst bei Bedarf ausgewertet (wie es sein soll!)

Ich finde die Schreibweise mit diesem Modul übersichtlicher als mit den "... and ... or ..."-Tricks.

Das Module gibts unter:
http://www.beyond-thoughts.com/tmp/switch.tar.gz


Beispiele (vgl. auch __init__.py ausführen)
"from switch import *" nicht vergessen!!


Code: Alles auswählen

result= SWITCH(
    iff(True) > then > testprint("Be True")
    or testprint("Bad Boy!"))

Code: Alles auswählen

result= SWITCH(
    iff(True) > then > "Yeah",
    iff(False) > then > "Never",
    iff(False) > then > testprint("this won't be called"),
    iff(True) > then > testprint("check this out"))

cu beyond

Verfasst: Donnerstag 8. Januar 2004, 00:55
von Beyond
Noch was:
Ich habe beim Anhängen der LGPL die Angabe für den Interpreter (bei Linux und Co) kaputt gemacht. Man braucht also zum Ausführen
"python ./__init__.py"

cu

Verfasst: Donnerstag 8. Januar 2004, 02:29
von Dookie
hmm irgendwie check ich den Nutzen des Moduls nicht, Die Beispiele lassen sich doch mit if ... elif ... else genausogut realisieren?


Gruß

Dookie

Verfasst: Donnerstag 8. Januar 2004, 16:46
von Beyond
Lassen sie sich --- aber es ist mehr Schreibarbeit (ich optimiere das Ganze wohl noch etwas).

if:
else:

sind außerdem Statements mit dem Modul hast Du eine Expression (ternary)
Nützlich z.B. wenn Du einen Funktionsaufruf mit einem von ifthenelse-abhängigen Argument machen willst.

C hat dafür z.B. var= bool ? tcase : fcase

Vgl auch Pep308 :-)


cu beyond

Re: Module für ifthenelse und switch !!

Verfasst: Donnerstag 8. Januar 2004, 18:28
von Milan
Beyond hat geschrieben: Ich finde die Schreibweise mit diesem Modul übersichtlicher als mit den "... and ... or ..."-Tricks.
Ich nehm mal an, du meinst statt sowas:

Code: Alles auswählen

if a==2: x="Yeah"
elif a==3: x="Never"
elif a==4: x="blubber"
else: x="sonst"
dann das hier:

Code: Alles auswählen

x=(a==2 and "Yeah") or (a==3 and "Never") or (a==4 and "blubber") or "sonst"
Ist doch eigentlich gar nicht unübersichtlich... und geht in der Auswertung bestimmt schneller, da ja nur ausgewertet wird, bis eins zutrifft. :roll:

Verfasst: Donnerstag 8. Januar 2004, 18:55
von Dookie
Das geht auch noch so:

Code: Alles auswählen

select = {2:"Yeah", 3:"Never", 4:"blubber"}
res = select.get(a,"sonst")
Statt den Strings können auch Funktionen im Dictionary gespeichert werden und dann aufgerufen werden.


Gruß

Dookie

Verfasst: Donnerstag 8. Januar 2004, 19:28
von Milan
Das ist dann aber schon wieder ein Statemant, da es (vorher) eine Zuweisung gibt. Gesucht ist eine expression, die dann ja auch z.B. in lambdafunktionen benutzt werden kann:

Code: Alles auswählen

res = {2:"Yeah", 3:"Never", 4:"blubber"}.get(a,"sonst")

Verfasst: Donnerstag 8. Januar 2004, 21:16
von Beyond
Wichtig dabei ist außerdem und das klappt leider bei den ganzen Dictionary etc. Geschichten nicht, daß nur die (sub-)expression ausgewertet wird, die wirklich benötigt wird.

Die Funktion "testprint" in meinem Beispiel gibt den String auch aus --- das ist ein Seiteneffekt, der nur für den zutreffenden Fall auftreten darf.

In Python geht das IMO nur mit lambdas (das wird aber krass ...) oder mit Operatoren die eigentlich Bools liefern und die Auswertung vorzeitig abbrechen z.B. and, or, <, >

Bei den Code von Milan kann man z.B. einen möglichen (hier ist es so richtig) Fehler erkennen.
Falls z.B. im Fall a==2 nicht "Yeah" kommt sondern z.B. 0 dann wird das ganze weiter ausgewertet und 0 eben nicht als Ergebnis geliefert!
Man kann das Ganze dann noch in Tuple verpacken (diese sind True) und anschließend wieder entpacken, dann siehts total übersichtlich aus...


cu beyond

Verfasst: Freitag 9. Januar 2004, 11:56
von Milan
Beyond hat geschrieben:Bei den Code von Milan kann man z.B. einen möglichen (hier ist es so richtig) Fehler erkennen.
Falls z.B. im Fall a==2 nicht "Yeah" kommt sondern z.B. 0 dann wird das ganze weiter ausgewertet und 0 eben nicht als Ergebnis geliefert!
Man kann das Ganze dann noch in Tuple verpacken (diese sind True) und anschließend wieder entpacken, dann siehts total übersichtlich aus...
siehe hier :wink: Der Trick dabei ist, das durch die nicht leere Liste ein eventuell "falscher" Wert bei der logischen Verknüpfung richtig ist. Extrem geschachtelt eventuell unübersichtlich, aber es hält sich in Grenzen... Sowas ist ja auch nur für Sachen, in denen man wirklich nur eine expression statt einem if Verwenden darf, z.B. bei kleinen lambda's für Tkinter Buttons...