如果没有,最好的方法是什么?
现在我正在做(对于django项目):
if not 'thing_for_purpose' in request.session:
request.session['thing_for_purpose'] = 5
但它非常尴尬。在Ruby中它将是:
request.session['thing_for_purpose'] ||= 5
更好。
答案 0 :(得分:155)
接受的答案对于dicts来说是好的,但是标题寻求一般等同于Ruby的|| =运算符。在Python中执行类似|| =的常见方法是
x = x or new_value
答案 1 :(得分:14)
答案 2 :(得分:9)
如果您在中间件或其他内容中执行此操作,则设置默认值是有意义的,但如果您在一个请求的上下文中需要默认值:
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 ...
答案 3 :(得分: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)
。
答案 4 :(得分:0)
通常,您可以使用dict[key] = dict.get(key, 0) + val
。