Seite 1 von 1

blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 19:53
von torres
Hallo,

ich wollte einmal fragen, ob mal so eine Konstruktion in Python machen kann:

def foo():
return 1

bar=foo() || bar=3
print(bar)

Wie wuerde man das schreiben? (weil so wie es da steht, funktioniert es nicht)

Danke und viele Gruesse,
Torres

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 20:01
von Hyperion
torres hat geschrieben:Hallo,

ich wollte einmal fragen, ob mal so eine Konstruktion in Python machen kann:

def foo():
return 1

bar=foo() || bar=3
print(bar)

Wie wuerde man das schreiben? (weil so wie es da steht, funktioniert es nicht)
Was soll das Konstrukt denn tun? Ich lese es bisher so: Entweder soll bar an den Rückgabewert von foo gebunden werden oder an 3. Das würde man in Python so schreiben:

Code: Alles auswählen

In [26]: def foo():
   ....:     return 1
   ....: 

In [27]: bar = foo() or 3

In [28]: bar
Out[28]: 1

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 20:08
von cofi
Hyperion hat geschrieben:Entweder soll bar an den Rückgabewert von foo gebunden werden oder an 3.
Als Ergänzung: 3 wird genau dann zurueckgegeben, wenn `foo()` zu etwas falschem evaluiert.

Also rueck raus, was du vorhast.

Daneben gibt es Code-Tags ohne die Python-Code zu posten sinnlos ist, da die Einrueckung verloren geht.

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 20:19
von torres
Vielen Dank!

Also ich hab damit eigentlich gar nichts vor, es war eine Frage von einem Kollegen,
der sonst nur perl schreibt und ich konnte es nicht beantworten. (ich aergere mich jetzt,
dass ich nicht selbst auf or gekommen bin)
Ich persoenlich haette ein return false in die Funktion eingebaut oder
den Schotter mit einer try except abgefangen, umstaendlich wie ich eben bin :-)

Viele Gruesse,
Torres

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 20:21
von Hyperion
torres hat geschrieben: Ich persoenlich haette ein return false in die Funktion eingebaut oder
den Schotter mit einer try except abgefangen, umstaendlich wie ich eben bin :-)
Kapiere ich jetzt nicht! Muss doch einen Anwendungsfall geben?!? So eine Frage fällt doch nicht vom Himmel. Nur mit Deinen "Erklärungen" kann ich da jetzt nichts anfangen...

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 20:26
von torres
Hyperion hat geschrieben:
torres hat geschrieben: Ich persoenlich haette ein return false in die Funktion eingebaut oder
den Schotter mit einer try except abgefangen, umstaendlich wie ich eben bin :-)
Kapiere ich jetzt nicht! Muss doch einen Anwendungsfall geben?!? So eine Frage fällt doch nicht vom Himmel. Nur mit Deinen "Erklärungen" kann ich da jetzt nichts anfangen...
Also der Anwendungsfall ist der: es gilt eine Funktion abzufragen, die einen Wert oder nichts zurueckliefert und wie man das nichts in eine Variable schreibt und dabei moeglichst wenig tippt.

Viele Gruesse,
Torres

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 20:30
von Hyperion
torres hat geschrieben: Also der Anwendungsfall ist der: es gilt eine Funktion abzufragen, die einen Wert oder nichts zurueckliefert und wie man das nichts in eine Variable schreibt und dabei moeglichst wenig tippt.
Du meinst eher, wie man anstelle des "nichts" einen default-Wert an einen Namen bindet?

Das was Du grad beschreibst geht nämlich einfach so ;-)

Code: Alles auswählen

In [33]: def foo():
   ....:     pass
   ....: 

In [34]: bar = foo()

In [35]: bar

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 20:40
von torres
Hyperion hat geschrieben:
torres hat geschrieben: Also der Anwendungsfall ist der: es gilt eine Funktion abzufragen, die einen Wert oder nichts zurueckliefert und wie man das nichts in eine Variable schreibt und dabei moeglichst wenig tippt.
Du meinst eher, wie man anstelle des "nichts" einen default-Wert an einen Namen bindet?

Das was Du grad beschreibst geht nämlich einfach so ;-)

Code: Alles auswählen

In [33]: def foo():
   ....:     pass
   ....: 

In [34]: bar = foo()

In [35]: bar
Sorry, bei dem Beispiel ist mir jetzt nicht klar welchen Wert bar bekommt, wenn foo() nichts liefert.

ansonsten eben noch so:

bar=3
bar=foo()

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 20:43
von derdon
torres: Der Standardrückgabewert ist bei Pythons Funktionen immer None. Das heißt, wenn kein expliziter Wert zurückgegeben wurde, wird None zurückgegeben. Statt "pass" hätte da also auch "return None" stehen können. Es hätte keinen Unterschied gemacht.

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 20:47
von torres
:-) okay, dann muesste ich weiter kongretisieren, dass bar = foo() sein soll oder "anderer definierter Wert" aber nicht none

Danke!
Und viele Gruesse

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 21:05
von sparrow

Code: Alles auswählen

>>> f = None
>>> f or "hallo"
'hallo'
>>> def a():
...  return None
... 
>>> a()
>>> a() or "hallo"
'hallo'
>>> 

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 21:16
von BlackJack
@torres: Vergiss das mit dem ``or`` -- das ist ein hässlicher und fehleranfälliger Hack. Der Anwendungsfall ist nichts für Python, denn dort sollte das Ziel nicht sein möglichst wenig zu tippen, sondern lesbaren und verständlichen Quelltext zu schreiben. Das wäre in diesem Falle sowas hier:

Code: Alles auswählen

bar = foo()
if bar is None:
    bar = 3
Das *funktioniert* im Gegensatz zu diesen schrecklichen ``or``-Geschichten auch mit allen Rückgabewerten.

Re: blubb=function() || blubb = "foo"

Verfasst: Montag 21. Februar 2011, 21:37
von Hyperion
BlackJack hat geschrieben: Das *funktioniert* im Gegensatz zu diesen schrecklichen ``or``-Geschichten auch mit allen Rückgabewerten.
Der tatsächliche Anwendungsfall kam ja auch erst später zur Sprache.

Re: blubb=function() || blubb = "foo"

Verfasst: Dienstag 22. Februar 2011, 20:27
von torres
BlackJack hat geschrieben:@torres: Vergiss das mit dem ``or`` -- das ist ein hässlicher und fehleranfälliger Hack. Der Anwendungsfall ist nichts für Python, denn dort sollte das Ziel nicht sein möglichst wenig zu tippen, sondern lesbaren und verständlichen Quelltext zu schreiben. Das wäre in diesem Falle sowas hier:

Code: Alles auswählen

bar = foo()
if bar is None:
    bar = 3
Das *funktioniert* im Gegensatz zu diesen schrecklichen ``or``-Geschichten auch mit allen Rückgabewerten.
Servus,

genauso hatte ich es meinem Kollegen vorgeschlagen, u.a. auch wegen der Lesbarkeit (und weil
ich da etwas paranoid bin); wobei ich allerdings in die Funktion ein return False eingebaut haette. (muss ich zugeben, dass ich von dem None nichts wusste)

Vielen Dank und viele Gruesse,
Torres

Re: blubb=function() || blubb = "foo"

Verfasst: Samstag 19. März 2011, 11:26
von mutetella
BlackJack hat geschrieben:Vergiss das mit dem ``or`` -- das ist ein hässlicher und fehleranfälliger Hack.
Was ist an 'or' hässlich und noch wichtiger: Was ist daran fehleranfällig?
Folgende Konstruktionen sehe ich immer wieder, was ist das konkrete Problem dabei?

Code: Alles auswählen

class Upsala(object):
    def __init__(self, hopsala=None):
        self.hopsala = hopsala or []
Gruß
mutetella

Re: blubb=function() || blubb = "foo"

Verfasst: Samstag 19. März 2011, 12:05
von deets
Deshalb:

Code: Alles auswählen

>>> cond = True
>>> a = 1
>>> b = 2
>>> cond and a or b
1
>>> cond = False
>>> cond and a or b
2
>>> a = 0
>>> cond = True
>>> cond and a or b
2

Re: blubb=function() || blubb = "foo"

Verfasst: Samstag 19. März 2011, 12:19
von BlackJack
@mutetella: Bei dem gezeigten Quelltext mag es kein Problem geben. Man kann halt `hopsala` nichts "falsches" übergeben was nicht durch eine leere Liste ersetzt wird. Zum Beispiel auch keine eigene leere Liste. Dann unterscheidet sich die Semantik subtil:

Code: Alles auswählen

class A(object):
    def __init__(self, a=None):
        self.a = a or []


class B(object):
    def __init__(self, a=None):
        self.a = a if a is not None else []
    

def main():
    for c in [A, B]:
        xs = list()
        obj = c(xs)
        xs.append(42)
        print xs == obj.a


if __name__ == '__main__':
    main()

Re: blubb=function() || blubb = "foo"

Verfasst: Samstag 19. März 2011, 19:26
von mutetella
Ok, herzlichen Dank für Eure Erklärung!