Python中是否有像Ruby中的“=”或“equals”的函数?

如果没有,最好的办法是什么?

现在我正在做(为一个Django项目):

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

但相当尴尬。 在Ruby中,它将是:

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

这更好。

被接受的答案对于字典是好的,但标题寻求一个相当于Ruby的|| =操作符的通用。 在Python中执行像|| =的常见方法是

 x = x or new_value 

dictsetdefault()

所以如果request.session是一个dict

 request.session.setdefault('thing_for_purpose', 5) 

如果你在中间件或者其他东西中设置默认值是有意义的,但是如果你在一个请求的上下文中需要一个默认值:

 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没有一个内置的操作符op ,可以将x = x or y转换为x op y

但是,它几乎没有。 如果两个操作数都被视为布尔值,则按位或等于运算符( |=将按上述方式运行,并带有警告。 (什么是警告?答案当然在下面。)

一,function的基本演示:

 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不是严格的types,因此即使这些值被视为一个expression式中的布尔值,如果给定一个按位运算符,它们也不会被短路。 例如,假设我们有一个清除列表的布尔函数,并返回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 = x | my_clear_list(lst)相当于x |= my_clear_list(lst)

一般来说,你可以使用dict[key] = dict.get(key, 0) + val