Module für ifthenelse und switch !!

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Mittwoch 7. Januar 2004, 23:37

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
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Donnerstag 8. Januar 2004, 00:55

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 8. Januar 2004, 02:29

hmm irgendwie check ich den Nutzen des Moduls nicht, Die Beispiele lassen sich doch mit if ... elif ... else genausogut realisieren?


Gruß

Dookie
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Donnerstag 8. Januar 2004, 16:46

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Donnerstag 8. Januar 2004, 18:28

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:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 8. Januar 2004, 18:55

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Donnerstag 8. Januar 2004, 19:28

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")
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Donnerstag 8. Januar 2004, 21:16

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Freitag 9. Januar 2004, 11:56

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...
Antworten