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
dict
有setdefault()
。
所以如果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
。