Seite 1 von 1
Neue Condition expression in python 2.5
Verfasst: Donnerstag 3. November 2005, 22:45
von leobm
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
Verfasst: Donnerstag 3. November 2005, 23:45
von 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
nicht wirklich schlimm.
Verfasst: Donnerstag 3. November 2005, 23:56
von leobm
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
Verfasst: Freitag 4. November 2005, 05:05
von mitsuhiko
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?
Verfasst: Freitag 4. November 2005, 07:13
von henning
@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.
Verfasst: Freitag 4. November 2005, 07:23
von mawe
Hi!
@blackbird: Deine erste Variante finde ich ausgesprochen hässlich.
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
Verfasst: Freitag 4. November 2005, 08:35
von henning
mawe hat geschrieben:Hi!
@blackbird: Deine erste Variante finde ich ausgesprochen hässlich.
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?
Verfasst: Freitag 4. November 2005, 08:41
von mawe
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

Verfasst: Freitag 4. November 2005, 15:09
von Joghurt
Also ich finde das annehmbar. Wenngleich es auch so gut wie keine Schreibarbeit spart:
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)
Verfasst: Freitag 4. November 2005, 15:34
von 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
Verfasst: Freitag 4. November 2005, 16:15
von mawe
Hi!
Was haltet ihr eigentlich davon (Infix is aus dem Cookbook)
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
Verfasst: Freitag 4. November 2005, 16:52
von BlackJack
leobm hat geschrieben:Das finde ich zu lang. Man kann somit nicht eben mal einen Ausdruck in einer Zeile auswerten.
Na und?
Verfasst: Freitag 4. November 2005, 17:01
von 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.
Verfasst: Sonntag 6. November 2005, 14:37
von Leonidas
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.