そうでない場合、これを行う最良の方法は何ですか?
今私はやっています(Djangoプロジェクト):
if not 'thing_for_purpose' in request.session:
request.session['thing_for_purpose'] = 5
しかし、それはかなり厄介です。 Rubyでは:
request.session['thing_for_purpose'] ||= 5
ずっといいです。
受け入れられた答えは辞書には適していますが、タイトルはRubyの|| =演算子に一般的な同等物を求めています。 || = in Pythonのような何かをする一般的な方法は
x = x or new_value
dict
には setdefault()
があります。
したがって、request.session
はdict
です:
request.session.setdefault('thing_for_purpose', 5)
デフォルトを設定するのは、ミドルウェアなどで行う場合に意味がありますが、1つのリクエストのコンテキストでデフォルト値が必要な場合は次のようになります。
request.session.get('thing_for_purpose', 5) # gets a default
ボーナス:||=
Pythonで。
def test_function(self, d=None):
'a simple test function'
d = d or {}
# ... do things with d and return ...
正確な答え:いいえ Pythonには、x = x or y
をx op y
に変換できる単一の組み込み演算子op
がありません。
しかし、ほとんどありません。ビットごとのor-equals演算子(|=
)willは、両方のオペランドがブール値として扱われ、注意が必要です。 (注意点は何ですか?答えはもちろん以下です。)
まず、機能の基本的なデモ:
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
注意事項はpython厳密に型指定されていないため、値が式でブール値として扱われている場合でも、ビットごとの演算子に渡された場合は短絡しません。 、リストが消去され、要素が削除された場合にTrue
を返すブール関数があるとします。
def my_clear_list(lst):
if not lst:
return False
else:
del lst[:]
return True
これで、短絡動作が次のように表示されます。
x = True
lst = [1, 2, 3]
x = x or my_clear_list(lst)
print(x, lst)
Output: True [1, 2, 3]
ただし、or
をビット単位または(|
)に切り替えると、短絡が除去されるため、関数my_clear_list
が実行されます。
x = True
lst = [1, 2, 3]
x = x | my_clear_list(lst)
print(x, lst)
Output: True []
上記のx = x | my_clear_list(lst)
はx |= my_clear_list(lst)
と同等です。
一般に、dict[key] = dict.get(key, 0) + val
を使用できます。