web-dev-qa-db-ja.com

PythonはRubyの|| =のような「または等しい」関数を持っていますか?

そうでない場合、これを行う最良の方法は何ですか?

今私はやっています(Djangoプロジェクト):

if not 'thing_for_purpose' in request.session:
    request.session['thing_for_purpose'] = 5

しかし、それはかなり厄介です。 Rubyでは:

request.session['thing_for_purpose'] ||= 5

ずっといいです。

69
Sean W.

受け入れられた答えは辞書には適していますが、タイトルはRubyの|| =演算子に一般的な同等物を求めています。 || = in Pythonのような何かをする一般的な方法は

x = x or new_value
165
Joseph Sheedy

dictには setdefault() があります。

したがって、request.sessiondictです:

request.session.setdefault('thing_for_purpose', 5)
15
Jon-Eric

デフォルトを設定するのは、ミドルウェアなどで行う場合に意味がありますが、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 ...
9
Brian Hicks

正確な答え:いいえ Pythonには、x = x or yx 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)と同等です。

6
Apollys

一般に、dict[key] = dict.get(key, 0) + valを使用できます。

0
curtissv