Wenn nicht, wie geht das am besten?
Im Moment mache ich (für ein Django-Projekt):
if not 'thing_for_purpose' in request.session:
request.session['thing_for_purpose'] = 5
aber es ist ziemlich umständlich. In Ruby wäre es:
request.session['thing_for_purpose'] ||= 5
das ist viel schöner.
nil
(false im booleschen Kontext), wird diese Redewendung häufig genau für den Zweck verwendet, den sean verwendet hat. Das Idiom funktioniert nur , wenn , wenn, natürlich,nil
undfalse
sind nicht legitim Werte in der Hash (was sehr häufig der Fall ist, so das Idiom in Ordnung ist)//=
Sie es in Perl finden . Ich denke das kommt||=
auch von Perl.Antworten:
Die akzeptierte Antwort ist gut für Diktate, aber der Titel sucht ein allgemeines Äquivalent zu Rubys || = Operator. Ein üblicher Weg, um etwas wie || = in Python zu tun, ist
x = x or new_value
quelle
x
er zuvor definiert wurde (z. B.None
in einer Klasseninitialisierungsmethode festgelegt).dict
hatsetdefault()
.Also wenn
request.session
ist eindict
:request.session.setdefault('thing_for_purpose', 5)
quelle
Präzise Antwort: Nein. Python verfügt nicht über einen einzigen integrierten Operator
op
, in den übersetztx = x or y
werden kannx op y
.Aber es tut es fast. Der bitweise oder gleich Operator (
|=
) wird wie oben beschrieben funktionieren , wenn beide Operanden als Boolesche Werte behandelt werden, mit einem Vorbehalt. (Was ist die Einschränkung? Die Antwort ist natürlich unten.)Zunächst die grundlegende Demonstration der Funktionalität:
x = True x Out[141]: True x |= True x Out[142]: True x |= False x Out[143]: True x &= False x Out[144]: False x &= True x Out[145]: False x |= False x Out[146]: False x |= True x Out[147]: True
Die Einschränkung ist darauf zurückzuführen, dass Python nicht streng typisiert ist. Selbst wenn die Werte in einem Ausdruck als Boolesche Werte behandelt werden, werden sie nicht kurzgeschlossen, wenn sie einem bitweisen Operator zugewiesen werden. Angenommen, wir hatten eine boolesche Funktion, die eine Liste löscht und zurückgibt,
True
wenn Elemente gelöscht wurden:def my_clear_list(lst): if not lst: return False else: del lst[:] return True
Jetzt können wir das kurzgeschlossene Verhalten so sehen:
x = True lst = [1, 2, 3] x = x or my_clear_list(lst) print(x, lst) Output: True [1, 2, 3]
Wenn Sie jedoch
or
auf bitweise oder (|
) umschalten , wird der Kurzschluss behoben, sodass die Funktionmy_clear_list
ausgeführt wird.x = True lst = [1, 2, 3] x = x | my_clear_list(lst) print(x, lst) Output: True []
Oben
x = x | my_clear_list(lst)
ist äquivalent zux |= my_clear_list(lst)
.quelle
Das Festlegen eines Standardwerts ist sinnvoll, wenn Sie dies in einer Middleware oder Ähnlichem tun, wenn Sie jedoch einen Standardwert im Kontext einer Anforderung benötigen:
request.session.get('thing_for_purpose', 5) # gets a default
Bonus: Hier erfahren Sie, wie Sie wirklich
||=
in Python arbeiten.def test_function(self, d=None): 'a simple test function' d = d or {} # ... do things with d and return ...
quelle
Im Allgemeinen können Sie verwenden
dict[key] = dict.get(key, 0) + val
.quelle