そうでない場合、これを行うための最良の方法は何ですか?
今私は(djangoプロジェクトのために)やっています:
if not 'thing_for_purpose' in request.session:
request.session['thing_for_purpose'] = 5
しかし、それはかなり厄介です。Rubyでは次のようになります。
request.session['thing_for_purpose'] ||= 5
これははるかに良いです。
そうでない場合、これを行うための最良の方法は何ですか?
今私は(djangoプロジェクトのために)やっています:
if not 'thing_for_purpose' in request.session:
request.session['thing_for_purpose'] = 5
しかし、それはかなり厄介です。Rubyでは次のようになります。
request.session['thing_for_purpose'] ||= 5
これははるかに良いです。
nil(ブール値のコンテキストではfalse)、このイディオムは、seanが使用した目的のために正確に使用されることがよくあります。イディオムは場合にのみものの、もちろん、作品、nilおよびfalse(非常に頻繁に本当であるので、イディオムで結構です)のハッシュで合法的な値ではありません
回答:
受け入れられた答えは口述に適していますが、タイトルはRubyの|| =演算子と一般的に同等のものを求めています。Pythonで|| =のようなことをする一般的な方法は
x = x or new_value
x以前に定義されている場合にのみ機能することに注意してください(たとえばNone、クラス初期化メソッドでに設定されている)。
dict持っていsetdefault()ます。
もしそうであればrequest.sessionありますdict:
request.session.setdefault('thing_for_purpose', 5)
正確な答えは:いいえ Pythonは、単一のないビルトイン演算子op翻訳することができますx = x or yにx op y。
しかし、ほとんどそうです。 ビットごとのor-equals演算子(|=)は、両方のオペランドがブール値として扱われている場合、上記のように機能しますが、注意が必要です。(注意点は何ですか?答えはもちろん以下です。)
まず、機能の基本的なデモンストレーション:
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)です。