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

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
torres
User
Beiträge: 47
Registriert: Samstag 29. Januar 2011, 13:23

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
torres
User
Beiträge: 47
Registriert: Samstag 29. Januar 2011, 13:23

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
torres
User
Beiträge: 47
Registriert: Samstag 29. Januar 2011, 13:23

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
torres
User
Beiträge: 47
Registriert: Samstag 29. Januar 2011, 13:23

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()
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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.
torres
User
Beiträge: 47
Registriert: Samstag 29. Januar 2011, 13:23

:-) okay, dann muesste ich weiter kongretisieren, dass bar = foo() sein soll oder "anderer definierter Wert" aber nicht none

Danke!
Und viele Gruesse
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Code: Alles auswählen

>>> f = None
>>> f or "hallo"
'hallo'
>>> def a():
...  return None
... 
>>> a()
>>> a() or "hallo"
'hallo'
>>> 
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
torres
User
Beiträge: 47
Registriert: Samstag 29. Januar 2011, 13:23

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
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
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()
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Ok, herzlichen Dank für Eure Erklärung!
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten