Re: "fauler Operator"?

06/07/2008 - 19:26 von Volker Grabsch | Report spam
Thomas Rachel <glglgl@expires-2008-07-31.arcornews.de> schrieb:

Statt

print truefunc() if cond else falsefunc()

geht auch


[...]

falsefunc=lambda: <False-Ausdruck>
truefunc=lambda: <True-Ausdruck>

print (falsefunc,truefunc)[cond]()



Spàtestens hier wird aber klar, dass er imperative Stil
viel übersichtlicher ist:

if cond:
result = truefunc()
else:
result = falsefunc()
print result

Wenn man Python 2.5 hat, kann und sollte man den trinàren
Operator ruhig nutzen.

Aber in Python <= 2.4 sollte man IMHO nicht krampfhaft versuchen,
ihn "nachzubauen". Das ist ne nette Übung zur Unterhaltung, aber
gehört IMHO nicht in produktiven Code hinein, der noch von Menschen
gelesen werden soll.


Ist die Herkunft von cond ungewiß und kann es auch ein beliebiger Wert
sein, kann man ihn auch durch not not cond ersetzen.



"not not cond" erscheint mir irgendwie unpythonisch. Es ist ein
Umweg für etwas, das man in Python auch direkt ausdrücken kann:

bool(cond)

Hat "not not cond" dem gegenüber irgendeinen (subtilen) Vorteil?


Gruß,

Volker

"Wenn du der Meinung bist, der andere sei ein Depp, dann überlass das
Antworten denjenigen, die nicht dieser Meinung sind."

 

Lesen sie die antworten

#1 Peter Otten
06/07/2008 - 19:50 | Warnen spam
Volker Grabsch wrote:

Aber in Python <= 2.4 sollte man IMHO nicht krampfhaft versuchen,
ihn "nachzubauen". Das ist ne nette Übung zur Unterhaltung, aber
gehört IMHO nicht in produktiven Code hinein, der noch von Menschen
gelesen werden soll.



Wenn ich mich recht erinnere, gab ein Fehler, der sich mit einem
solchen "Nachbau" in die Standardbibliothek eingeschlichen hatte, den
Ausschlag für die Einführung des "ternàren Operators".

"not not cond" erscheint mir irgendwie unpythonisch. Es ist ein
Umweg für etwas, das man in Python auch direkt ausdrücken kann:

bool(cond)

Hat "not not cond" dem gegenüber irgendeinen (subtilen) Vorteil?



Ist etwas schneller, da der Funktionsaufruf vermieden wird:

$ python -m timeit -s"x = 42" "not not x"
10000000 loops, best of 3: 0.124 usec per loop
$ python -m timeit -s"x = 42" "bool(x)"
1000000 loops, best of 3: 0.301 usec per loop
$ python -m timeit -s"x = 42; _bool = bool" "_bool(x)"
1000000 loops, best of 3: 0.246 usec per loop

Peter

Ähnliche fragen