Neue Condition expression in python 2.5

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
leobm
User
Beiträge: 24
Registriert: Montag 4. November 2002, 10:14
Wohnort: Hamburg

A if C else B

Was haltet Ihr davon ? Einige Leute stehen dem ja recht negativ gegenüber
Als doch an eine andere Syntax gewöhnter Programmierer habe ich so etwas bisher schmerzlicht vermisst.

Ich finde das gut.

Besser jedenfalls als so etwas:

A = 1 and C or B

http://www.amk.ca/diary/2005/09/conditional_expression
BlackJack

Ich find's nicht so toll. Was mich am meisten daran stört ist, das die Abarbeitungsreihenfolge nicht der geschriebenen entspricht. Erst wird C ausgewertet und dann A oder B.

Nun sind wir so lange ohne diese Funktionalität ausgekommen. Ich finde ehrlich gesagt

Code: Alles auswählen

if C:
    x = A
else:
    x = B
nicht wirklich schlimm.
leobm
User
Beiträge: 24
Registriert: Montag 4. November 2002, 10:14
Wohnort: Hamburg

Das finde ich zu lang. Man kann somit nicht eben mal einen Ausdruck in einer Zeile auswerten.

Ich hatte mal so etwas irgendwo gesehen.
X= ifelse(A,B,C)

Wurde irgendwie mit lambda's gemacht..
fand ich eigentlich auch eine recht gute Idee.


Felix
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

ich mach immer so:

Code: Alles auswählen

            arglist = [
                re.compile(pattern[0]),
                pattern[1],
                (len(pattern) > 2) and pattern[2] or {}
            ]
Und lebe gut damit. Und das gefällt mir noch besser als die neue Syntax.

Was spräche denn gegen sowas?

Code: Alles auswählen

C = expression then "blub" else "blub"
TUFKAB – the user formerly known as blackbird
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

@leobm:
X = ifelse(A,B,C) ist ne akzeptable Lösung, aber:
- man sollte es wenn schon ifelse_(A,B,C) nennen (style guide: wenn man keywords mit funktionen nachahmt, mit nem unterstrich beenden)
- Bei einem Funktionsaufruf werden immer alle 3 Parameter ausgewertet (es gibt keinen "short-circuit"). Das kann in manchen Situationen unerwünscht sein.

Btw. kann man ds auch ohne die stilistisch fragwürdigen lambdas machen:

Code: Alles auswählen

def ifelse_(cond, r_if, r_else=None):
  if cond:
    return r_if
  return r_else
Ich finde auch "A then B else C" in jedem Fall schöner als "A if B else C", aus den o.g. Gründen. Ersteres ist auch insgesamt der vernünftigste Vorschlag im PEP zu dem Thema.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

@blackbird: Deine erste Variante finde ich ausgesprochen hässlich.

Code: Alles auswählen

let max a b = if a > b then a else b
Das ist z.B. ein OCaml code der mir für Python gefallen würde.

Wie auch immer, ich muss ehrlich sagen, dass ich bis jetzt in Python sehr gut ohne diese Syntax ausgekommen bin. Mir wärs lieber wenn sich die Entwickler endlich mal um die Module kümmern (aber das haben wir ja schon mal besprochen).

Gruß, mawe
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

mawe hat geschrieben:Hi!

@blackbird: Deine erste Variante finde ich ausgesprochen hässlich.

Code: Alles auswählen

let max a b = if a > b then a else b
Das ist z.B. ein OCaml code der mir für Python gefallen würde.
Du hast recht, an sich ist das netterer Code, das if am Anfang kann bloß zu Mißverständlichkeiten mit dem "alten" if: führen, aus dem selben Grund wird auch durchaus überlegt, sogar das "else" zu vermeiden. Aber das idt vielleicht echt ein bisschen korinthenkackerei.

Was meinst du mit um die Module kümmern?
Gehts um das mehrzeilige import?
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

henning hat geschrieben: Was meinst du mit um die Module kümmern?
Gehts um das mehrzeilige import?
Wir haben ja einmal darüber gesprochen, dass z.B. einige Funktionen aus dem os Modul eigentlich besser bei shutil aufgehoben wären. Solche Dinge hab ich gemeint.

Wenn ich mir die verschiedensten Blogs zum Thema "neue Python Version" durchlese, scheine ich auch nicht der einzige zu sein, dem das wichtiger ist als neue Syntay einzuführen ;)
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Code: Alles auswählen

Foo = 42 if Bar<12 else 23
Also ich finde das annehmbar. Wenngleich es auch so gut wie keine Schreibarbeit spart:

Code: Alles auswählen

if Bar<12:
  Foo = 42
else:
  Foo = 23
Letzteres ist deutlich lesbarer und benötigt nur 7 Tastendrücke mehr. Der Sinn dieses Konstruktes erschließt sich mir deshalb nicht so ganz.

Edit: OK, das ganze ist ein vollwertiger ?:-Clone. Dann macht das Sinn, wenn man auch sowas schreiben kann:

Code: Alles auswählen

foo = Bar(jede, menge, [parameter, und, noch], ein, paar, mehr, 24 if Baz else 9)
joe

Hi!
mawe hat geschrieben:Wir haben ja einmal darüber gesprochen, dass z.B. einige Funktionen aus dem os Modul eigentlich besser bei shutil aufgehoben wären.

Das ist aber nichts für Versionen < Python3000. Das gäbe ein ziemliches durcheinander.
joe
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Was haltet ihr eigentlich davon (Infix is aus dem Cookbook) :D

Code: Alles auswählen

class Infix:
    def __init__(self, function):
        self.function = function
    def __ror__(self, other):
        return Infix(lambda x, self=self, other=other: self.function(other, x))
    def __or__(self, other):
        return self.function(other)
    def __call__(self, value1, value2):
        return self.function(value1, value2)

def lala(value, lst):
    if lst[0]: return value
    else: return lst[1]

when = Infix(lala)

c = 4
d = "greater" |when| (c>3, "smaller")
print d
Gruß, mawe
BlackJack

leobm hat geschrieben:Das finde ich zu lang. Man kann somit nicht eben mal einen Ausdruck in einer Zeile auswerten.
Na und?
BlackJack

henning hat geschrieben:@leobm:
X = ifelse(A,B,C) ist ne akzeptable Lösung, aber:
- man sollte es wenn schon ifelse_(A,B,C) nennen (style guide: wenn man keywords mit funktionen nachahmt, mit nem unterstrich beenden)
Nein `ifelse` ist schon okay. Es geht im Styleguide nicht um das Nachahmen von Schlüsselwörtern sondern was man machen soll, wenn man ein Schlüsselwort als Namen verwenden will.
Btw. kann man ds auch ohne die stilistisch fragwürdigen lambdas machen:

Code: Alles auswählen

def ifelse_(cond, r_if, r_else=None):
  if cond:
    return r_if
  return r_else
Wenn Du nicht möchtest das die Argumente `r_if` und `r_else` vor dem Aufruf ausgewertet werden , dann brauchst Du doch wieder ``lambda`` oder ein Closure um die Argumente. In dem Beispiel wären die Parameternamen übrigens ein Beispiel für den Unterstrich: Man hätte hier `if_` und `else_` nehmen können.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

joe hat geschrieben:
mawe hat geschrieben:Wir haben ja einmal darüber gesprochen, dass z.B. einige Funktionen aus dem os Modul eigentlich besser bei shutil aufgehoben wären.

Das ist aber nichts für Versionen < Python3000. Das gäbe ein ziemliches durcheinander.
Wenn Python 3000, ahem 3.0 überhaupt so revolutionär wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten