Если нет, как лучше всего это сделать?
Прямо сейчас делаю (для проекта 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
не являются допустимыми значениями в хэше (что очень часто бывает правдой, поэтому идиома в порядке)//=
в perl . Я думаю, что это||=
тоже происходит из Perl.Ответы:
Принятый ответ хорош для dicts, но заголовок ищет общий эквивалент оператора || = в 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
.Но это почти так. Побитовый оператор «или-равно» (
|=
) будет работать, как описано выше, если оба операнда обрабатываются как логические, с оговоркой. (Какое предупреждение? Ответ, конечно же, ниже.)Во-первых, базовая демонстрация функциональности:
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)
.источник
Установка значения по умолчанию имеет смысл, если вы делаете это в промежуточном программном обеспечении или в чем-то еще, но если вам нужно значение по умолчанию в контексте одного запроса:
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 ...
источник
В общем пользоваться можно
dict[key] = dict.get(key, 0) + val
.источник